当我们将一个方法存储在一个变量中,然后调用它时,为什么上下文对象会变为全局窗口对象

When we store a method in a variable and then call it, Why does the context object change to the global window object?

本文关键字:一个 对象 上下文 我们将 为什么 窗口 全局 调用 存储 方法 变量      更新时间:2023-09-26

以下示例取自jqfundmentals,

var person = {
  firstName : 'Boaz',
  lastName : 'Sender',
  greet : function() {
    log( 'Hi, ' + this.firstName );
  }
};
var sayIt = person.greet; // store the method in a variable
sayIt(); // logs 'Hi, undefined' -- uh-oh

作为解释,

当我们将.geet()方法存储在变量sayIt中,然后调用sayIt()时,上下文对象将变为全局窗口对象,而不是person对象。由于窗口对象没有属性firstName,当我们试图访问它时,我们会得到未定义

我的问题是

当我们将.geet()方法存储在变量sayIt中,然后调用sayIt()时,为什么上下文对象变为全局窗口对象?

这是规范,请参阅ecma-262/5.1/#sec-10.4.3

控制进入执行时执行以下步骤函数对象F(调用方)中包含的函数代码的上下文提供了thisArg,调用方提供了argumentsList:

  1. 如果函数代码为严格代码,请将ThisBinding设置为thisArg
  2. 否则,如果thisArgnull未定义,则将ThisBinding设置为全局对象

因此,当处于严格模式时,this将引用undefined,否则将引用全局对象。

上下文对象更改为全局窗口,因为您没有任何上下文,默认情况下,当没有分配上下文时,"this"指的是窗口对象。

您可以在此链接中看到解释:http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/

关键字"new"的行为复杂且不明显。创建对象/函数时,添加新关键字会更改"this"的含义。当添加"new"时,"this"指的是对象,这是有意义的。然而,在下一个代码块中,省略了"new","this"指的是全局Window对象!代码示例显示了如何污染全局对象。小心"这个"。