2015-06-13 66 views
0

即时调用的函数表达式(IIFE)中的thisvar之间是否有区别?IIFE:var vs this - 有什么区别吗?

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

','var'地方。检查'console.log(这个===窗口)'。 – dfsq

+0

http://stackoverflow.com/questions/11285975/difference-between-var-and-this-in-javascript-functions可能的重复 –

回答

2

如果你的代码是在全球范围内执行,那么两个选项:

  1. 你在use strict模式,在这种情况下,this点什么(null或undefined),然后你会看到一个例外。

  2. 您在use strict模式不是,然后this指向窗口,在这种情况下,您将设置bar作为一个全局变量。

var保持并不会被暴露在IIFE的外线电话的局部变量(它在运行相同的范围内)。

0

当然有。

  • foo是IIFE
  • bar内作用域一个变量将针对任何this在执行上下文结合进行评估。
1

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价值取决于如何一个函数被调用。如果您没有提供thiscallbindapply的含义,则取决于函数的调用方式。例如,如果一个函数是一个对象的一部分,那么this会是谁拥有该函数的对象:this`设置全局变量

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