Javascript 为什么这个立即调用的方法返回窗口对象?

Javascript 为什么这个立即调用的方法返回窗口对象?,javascript,iife,Javascript,Iife,为什么立即调用的方法将窗口对象返回为this var o = {}; o.foo = function () { console.log(this); }(); //Window {…} 但是当稍后执行时,该方法返回对象o(正如我在这两种情况下所期望的那样) 这是全局上下文,这就是您看到窗口对象的原因。要获得它,请显示您的o对象,您需要将它显示到o对象此引用当前上下文中的对象。当对象不在任何其他上下文中时,this的值始终保持窗口对象 o.foo = function ()

为什么立即调用的方法将
窗口
对象返回为
this

var o = {};  
o.foo = function () {  
    console.log(this);  
}(); //Window {…}
但是当稍后执行时,该方法返回对象
o
(正如我在这两种情况下所期望的那样)

这是全局上下文,这就是您看到窗口对象的原因。要获得它,请显示您的
o
对象,您需要将它显示到
o
对象<代码>此引用当前上下文中的对象。当对象不在任何其他上下文中时,
this
的值始终保持
窗口
对象

o.foo = function () {  
    console.log(this);  
}.bind(o); //
演示:

这是全局上下文,这就是您看到窗口对象的原因。要获得它,请显示您的
o
对象,您需要将它显示到
o
对象<代码>此引用当前上下文中的对象。当对象不在任何其他上下文中时,
this
的值始终保持
窗口
对象

o.foo = function () {  
    console.log(this);  
}.bind(o); //

演示:

“this”在调用时定义。变量赋值是从右到左进行的,因此函数在赋值之前被调用,因此“this”仍然指全局窗口对象。

“this”是在调用时定义的。变量赋值是从右到左进行的,因此函数在赋值之前被调用,因此“this”仍然指全局窗口对象。

当执行一个中间调用的函数表达式(IIFE)时:


这个值不是通过调用设置的,因此在进入函数时它是未定义的,因此被设置为全局对象。在严格模式下,它将保持未定义状态。

当您执行即时调用的函数表达式(IIFE)时:


这个值不是通过调用设置的,因此在进入函数时它是未定义的,因此被设置为全局对象。在严格模式下,它将保持未定义状态。

如果在对象定义正文中执行
console.log(this)
,默认情况下它将引用窗口对象,因为您的对象在浏览器中不存在。 所以您必须在定义对象后执行函数,这是我的演示

如果在对象定义体中执行
console.log(this)
,默认情况下它将引用窗口对象,因为您的对象在浏览器中不存在。 所以您必须在定义对象后执行函数,这是我的演示

与上下文无关(此处的值来自函数上下文)。调用中未设置该值,因此它默认为全局对象。@RobG,所以我解释错了?术语“上下文”经常与此不恰当地结合使用。this关键字是执行上下文的参数,该参数由函数的调用方式(或绑定的使用)设置。它的值完全独立于调用的执行上下文,而不是上下文(这里的值来自函数上下文)。调用中未设置该值,因此它默认为全局对象。@RobG,所以我解释错了?术语“上下文”经常与此不恰当地结合使用。this关键字是执行上下文的参数,该参数由函数的调用方式(或绑定的使用)设置。它的值完全独立于调用的执行上下文。如果将IIFEs括在括号中,则代码会更清晰:
o.foo=(function(){…}())
。在第一次调用中,
这个
还会是什么,为什么您会这样认为/期望呢?如果将IIFE括在括号中,代码会更清晰:
o.foo=(function(){…}())。在第一次调用中,
这个
还会是什么?您为什么这么认为/期望?基本正确,但执行IIFE会创建一个新的执行上下文。因为这不是在调用中设置的,所以在新的执行上下文中设置为全局对象,它“仍然”指的不是全局对象。这和RobG的回答是有意义的。我不知道作业是对的。有用的表。基本正确,但执行IIFE会创建一个新的执行上下文。因为这不是在调用中设置的,所以在新的执行上下文中设置为全局对象,它“仍然”指的不是全局对象。这和RobG的回答是有意义的。我不知道作业是对的。有用的表格。
o.foo = function () {  
    console.log(this);  
}.bind(o); //
... = (function () {  
         console.log(this);
      }());