Javascript 此自调用匿名函数变量背后的原因

Javascript 此自调用匿名函数变量背后的原因,javascript,module,anonymous-function,coffeescript,commonjs,Javascript,Module,Anonymous Function,Coffeescript,Commonjs,在查看github时,我发现了以下内容: (function() { }).call(this); 这显然是一个自调用匿名函数。但为什么是这样写的呢?我习惯于看到规范变量(function(){})() 对于自调用匿名函数,使用.call(this)有什么特别的优势吗 编辑:它看起来像是一些commonjs环境在模块的顶层将此设置为非全局值。默认情况下,调用类似于(function(){/*…*/})(的函数将函数中的this的值设置为窗口(在浏览器中)无论的值是多少,此可能位于创建函数的

在查看github时,我发现了以下内容:

(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的方法可以做到这一点?