IIFE:var vs this - 有什么区别吗?

时间:2015-06-13 19:01:00

标签: javascript this var iife

在立即调用的函数表达式(IIFE)中,thisvar之间是否有任何区别?

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

3 个答案:

答案 0 :(得分:2)

如果您的代码在全局上下文中执行,那么有两个选项:

  1. 您处于use strict模式,在这种情况下this指向任何内容(空或未定义),然后您将看到异常。

  2. 您未处于use strict模式,然后this指向该窗口,在这种情况下,您将bar设置为全局变量。

  3. var将变量保持为本地(运行相同的范围),并且不会暴露给IIFE的外部调用。

答案 1 :(得分:1)

var是一个本地范围的变量。也就是说,它不会在IIFE之外提供。

另一方面,this.bar向当前对象添加属性。在你的情况下它是window

如果您想将变量,函数或任何成员导出到其他范围,我建议使用以下解决方案:

   var MyModule = (function(exports){
        var foo = 0;
        exports.bar = 0;

        return exports;
    })(MyModule || {});

上面的代码是模块模式的简单实现。

另一方面,如果你想在IIFE 中定义 this,你可以使用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的值取决于函数的调用方式。如果您未在callbindapply中提供this的含义,则取决于函数的调用方式。例如,如果函数是对象的一部分,那么this将是拥有该函数的对象:

var obj = {
    doStuff: function() {
         // "this" is "obj" by default
    }
};

答案 2 :(得分:0)

当然有。

  • foo是IIFE
  • 范围内的变量
  • bar将根据执行上下文中绑定的this进行评估。