在立即调用的函数表达式(IIFE)中,this
和var
之间是否有任何区别?
(function(){
var foo = 0;
this.bar = 0;
})();
答案 0 :(得分:2)
如果您的代码在全局上下文中执行,那么有两个选项:
您处于use strict
模式,在这种情况下this
指向任何内容(空或未定义),然后您将看到异常。
您未处于use strict
模式,然后this
指向该窗口,在这种情况下,您将bar
设置为全局变量。
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
的值取决于函数的调用方式。如果您未在call
,bind
或apply
中提供this
的含义,则取决于函数的调用方式。例如,如果函数是对象的一部分,那么this
将是拥有该函数的对象:
var obj = {
doStuff: function() {
// "this" is "obj" by default
}
};
答案 2 :(得分:0)
当然有。
foo
是IIFE bar
将根据执行上下文中绑定的this
进行评估。