即时调用的函数表达式(IIFE)中的this
和var
之间是否有区别?IIFE:var vs this - 有什么区别吗?
(function(){
var foo = 0;
this.bar = 0;
})();
即时调用的函数表达式(IIFE)中的this
和var
之间是否有区别?IIFE:var vs this - 有什么区别吗?
(function(){
var foo = 0;
this.bar = 0;
})();
如果你的代码是在全球范围内执行,那么两个选项:
你在use strict
模式,在这种情况下,this
点什么(null或undefined),然后你会看到一个例外。
您在use strict
模式不是,然后this
指向窗口,在这种情况下,您将设置bar
作为一个全局变量。
var
保持并不会被暴露在IIFE的外线电话的局部变量(它在运行相同的范围内)。
当然有。
foo
是IIFEbar
内作用域一个变量将针对任何this
在执行上下文结合进行评估。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
会是谁拥有该函数的对象:this`设置全局变量
var obj = {
doStuff: function() {
// "this" is "obj" by default
}
};
','var'地方。检查'console.log(这个===窗口)'。 – dfsq
http://stackoverflow.com/questions/11285975/difference-between-var-and-this-in-javascript-functions可能的重复 –