Javascript 此自调用匿名函数变量背后的原因
在查看github时,我发现了以下内容:Javascript 此自调用匿名函数变量背后的原因,javascript,module,anonymous-function,coffeescript,commonjs,Javascript,Module,Anonymous Function,Coffeescript,Commonjs,在查看github时,我发现了以下内容: (function() { }).call(this); 这显然是一个自调用匿名函数。但为什么是这样写的呢?我习惯于看到规范变量(function(){})() 对于自调用匿名函数,使用.call(this)有什么特别的优势吗 编辑:它看起来像是一些commonjs环境在模块的顶层将此设置为非全局值。默认情况下,调用类似于(function(){/*…*/})(的函数将函数中的this的值设置为窗口(在浏览器中)无论的值是多少,此可能位于创建函数的
(function() {
}).call(this);
这显然是一个自调用匿名函数。但为什么是这样写的呢?我习惯于看到规范变量(function(){})(
)
对于自调用匿名函数,使用.call(this)
有什么特别的优势吗
编辑:它看起来像是一些commonjs环境在模块的顶层将此设置为非全局值。默认情况下,调用类似于
(function(){/*…*/})(
的函数将函数中的this
的值设置为窗口(在浏览器中)无论的值是多少,此可能位于创建函数的封闭上下文中
使用call
可以手动将this
的值设置为所需值。在本例中,它将其设置为包含上下文中的this
的任何值
举个例子:
var obj = {
foo:'bar'
};
(function() {
alert( this.foo ); // "bar"
}).call( obj );
您可以看到,我们可以手动将this
的值设置为obj
变量引用的对象。通过使用:
> (function() {
> ...
> }).call(this);`
然后,将代码范围内的该对象(由全局对象指定)设置为函数的this对象。据我所知,这相当于:
(function(global) {
// global references the object passed in as *this*
// probably the global object
})(this);
在浏览器中,窗口通常是全局对象的别名(或者表现得好像是全局对象的别名)。.call(this)
(在我更改它之前实际上只是()
)确保您的顶级this
通过严格模式、--bare
选项和/或运行环境保持一致(其中顶层此
不指向全局对象)。自调用函数在加载脚本时可用于立即执行其内容。这便于初始化全局作用域元素。C={
C={
descript: "I'm C!<br>",
F: function() {
//set this to the caller context's 'this'
(function() {
document.write(this.descript);
}).call(this);
//set this to 'window' or 'undefined' depend the mode
(function() {
document.write(this.descript);
})();
//member function's 'this' is the object self
document.write(this.descript);
}
}
window.descript="I'm window!<br>";
C.F();
描述:“我是C!
”,
F:函数(){
//将其设置为调用方上下文的“this”
(功能(){
文件.书写(本.描述);
}).打电话(这个);
//根据模式将其设置为“窗口”或“未定义”
(功能(){
文件.书写(本.描述);
})();
//成员函数的“this”是对象本身
文件.书写(本.描述);
}
}
window.descript=“我是window!
”;
C.F();
(function(){}).call(this);
可以将匿名中的this
设置为调用方上下文this
,在上面是C
(function(){})()
将设置为窗口或未定义的取决于模式。可能重复@Rob我不认为这是肖恩在这个问题中要问的。啊,找到了-肯定不是重复的问题,但答案类似:哦,很好的链接@Matt。我可以看出,如果函数是嵌套的。对此答案的评论说,一些commonjs环境在模块的顶层将this
设置为非全局。这就解释了为什么您可能需要保留this
。第一个肯定不等同于第二个。它提供了对外部执行上下文this和stores的引用它是一个名为全局的局部变量,而不是这个。因此它是等价的,它只是将引用分配给局部激活/变量对象的不同属性。所有这些都没有任何意义。啊--(
)和。调用(this)
在严格模式下是不同的。现在它都有意义。。调用(this)
为函数提供了相同的上下文,即严格模式和宽松模式。@matyr您能用关于()和.call(此)的描述或链接进一步解释吗在严格模式下,它们实际上是什么意思?我无法理解严格模式位。在lax模式下,如果调用没有对象的函数,this
设置为window
。在严格模式下,this
设置为undefined
。使用。调用(this)
显式设置this
(函数内部)至此
(功能外),从而确保它保持为窗口
,无论您处于严格还是宽松模式。谢谢,@SeanMcMillan。我实际上理解了您所写的内容。我相信您的解释比答案要好得多。他的问题是,在末尾添加这个
有什么作用,而不是添加自定义对象有什么作用。@Startec:没有di差异。他们会做同样的事情。他只是传递了一个不同的对象,这样他就可以通过函数中的this
显示对象的属性变得可用。@sixfingeredman Right,这表明你可以通过在结束参数中传递一个对象来设置它的值。但是,问题是,当你在this
对象中使用ss,而不是您实例化的某个对象。换句话说,如果传入this
只是在封闭函数this
中生成this
的值,为什么要传入它呢?@Startec:我明白您的意思。因为它们实际上是相同的(除非在严格模式下),那么重点是什么呢?虽然这一理论基础是基于IIFE的全球执行,而这一细节似乎在稍后被添加到问题中。有没有ES2015的方法可以做到这一点?