下面的例子来自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()时为什么上下文对象会更改为全局窗口对象?
答案 0 :(得分:2)
这是规范,请参阅 ecma-262/5.1/#sec-10.4.3
当控制进入执行时,执行以下步骤 函数对象F中包含的函数代码的上下文,一个调用者 提供thisArg,并且调用者提供了argumentsList:
- 如果功能代码是严格代码,请将ThisBinding设置为 thisArg 。
- 如果 thisArg null 或未定义,请将ThisBinding设置为全局对象。
醇>.......
因此,当处于严格模式时,this
将引用undefined
,否则它将引用全局对象。
答案 1 :(得分:1)
上下文对象更改为全局窗口,因为您没有任何上下文,默认情况下,“this”指的是没有指定上下文时的窗口对象。
您可以在此链接中看到解释: http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/
'new'关键字的行为是错综复杂且非显而易见的。创建对象/函数时,添加新关键字会更改“this”的含义。当添加'new'时,'this'指的是对象,这是有道理的。但是在下一个代码块中,省略了'new','this'指的是全局Window对象!代码示例显示了如何污染全局对象。注意'这个'。