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

时间:2014-04-22 09:23:38

标签: javascript function variables object global-variables

下面的例子来自jqfundamentals,

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

作为解释,

当我们将.greet()方法存储在变量sayIt中然后调用sayIt()时,上下文对象将更改为全局窗口对象,而不是person对象。由于window对象没有属性firstName,因此当我们尝试访问它时,我们会得到undefined。

我的问题是

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

2 个答案:

答案 0 :(得分:2)

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

  

当控制进入执行时,执行以下步骤   函数对象F中包含的函数代码的上下文,一个调用者   提供thisArg,并且调用者提供了argumentsList:

     
      
  1. 如果功能代码是严格代码,请将ThisBinding设置为 thisArg
  2.   
  3. 如果 thisArg null 未定义,请将ThisBinding设置为全局对象
  4.         

    .......

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

答案 1 :(得分:1)

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

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

  

'new'关键字的行为是错综复杂且非显而易见的。创建对象/函数时,添加新关键字会更改“this”的含义。当添加'new'时,'this'指的是对象,这是有道理的。但是在下一个代码块中,省略了'new','this'指的是全局Window对象!代码示例显示了如何污染全局对象。注意'这个'。