IIFE: var vs this — есть ли разница?

Есть ли разница между this и var в немедленно вызываемых функциональных выражениях (IIFE)?

(function(){
    var foo = 0;
    this.bar = 0;
})();

person boop    schedule 13.06.2015    source источник
comment
this задает глобальную переменную, var локальную. Проверьте console.log(this === window).   -  person dfsq    schedule 13.06.2015
comment
Возможный дубликат stackoverflow .com/questions/11285975/   -  person Jochen van Wylick    schedule 13.06.2015


Ответы (3)


Если ваш код выполняется в глобальном контексте, то два варианта:

  1. Вы находитесь в режиме use strict, и в этом случае this ничего не указывает (null или undefined), и тогда вы увидите исключение.

  2. Вы не находитесь в режиме use strict, а затем this указывает на окно, и в этом случае вы установите bar в качестве глобальной переменной.

var сохраняет переменную локальной (в той же области, в которой она запущена) и не будет подвергаться внешним вызовам IIFE.

person Omri Aharon    schedule 13.06.2015

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
    }
};
person Matías Fidemraizer    schedule 13.06.2015

Есть конечно.

  • foo — это переменная в пределах IIFE.
  • bar будет сравниваться с тем, к чему привязан this в контексте выполнения.
person Dave Newton    schedule 13.06.2015