以下示例取自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:
- 如果函数代码为严格代码,请将ThisBinding设置为thisArg
- 否则,如果thisArg为null或未定义,则将ThisBinding设置为全局对象
因此,当处于严格模式时,this
将引用undefined
,否则将引用全局对象。
上下文对象更改为全局窗口,因为您没有任何上下文,默认情况下,当没有分配上下文时,"this"指的是窗口对象。
您可以在此链接中看到解释:http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/
关键字"new"的行为复杂且不明显。创建对象/函数时,添加新关键字会更改"this"的含义。当添加"new"时,"this"指的是对象,这是有意义的。然而,在下一个代码块中,省略了"new","this"指的是全局Window对象!代码示例显示了如何污染全局对象。小心"这个"。