Есть ли разница между this
и var
в немедленно вызываемых функциональных выражениях (IIFE)?
(function(){
var foo = 0;
this.bar = 0;
})();
Есть ли разница между this
и var
в немедленно вызываемых функциональных выражениях (IIFE)?
(function(){
var foo = 0;
this.bar = 0;
})();
Если ваш код выполняется в глобальном контексте, то два варианта:
Вы находитесь в режиме use strict
, и в этом случае this
ничего не указывает (null или undefined), и тогда вы увидите исключение.
Вы не находитесь в режиме use strict
, а затем this
указывает на окно, и в этом случае вы установите bar
в качестве глобальной переменной.
var
сохраняет переменную локальной (в той же области, в которой она запущена) и не будет подвергаться внешним вызовам IIFE.
var
— это локальная переменная. То есть он не будет доступен за пределами IIFE.
С другой стороны, this.bar
добавляет свойство к текущему объекту. В вашем случае это window
.
Я бы рекомендовал следующее решение, если вы хотите экспортировать переменные, функции или любой элемент в другую область:
var MyModule = (function(exports){
var foo = 0;
exports.bar = 0;
return exports;
})(MyModule || {});
Вышеприведенный код представляет собой простую реализацию шаблона модуля.
С другой стороны, если вы хотите определить что такое this
внутри IIFE, вы можете вызвать его с помощью call
:
// You don't need "exports" anymore
// since "this" works the same way
var MyModule = (function(){
var foo = 0;
this.bar = 0;
return this;
}).call(MyModule || {});
В конце концов, значение this
зависит от того, как вызывается функция. Если вы не указали значение this
с помощью call
, bind
или apply
, это будет зависеть от того, как вызывается функция. Например, если функция является частью объекта, то this
будет объектом, которому принадлежит функция:
var obj = {
doStuff: function() {
// "this" is "obj" by default
}
};
Есть конечно.
foo
— это переменная в пределах IIFE.bar
будет сравниваться с тем, к чему привязан this
в контексте выполнения.
this
задает глобальную переменную,var
локальную. Проверьтеconsole.log(this === window)
. - person dfsq   schedule 13.06.2015