“如果在另一个函数中有内部函数,则此变量引用全局对象(通常是窗口)” - 引自http://www.codecademy.com
问题是案件中发生了什么? 我有例子:
var person = {
name: 'Juriy',
speakFunction: function() {
return function() {
return 'My name is ' + this.person.name
}
}
};
var speakFunction = person.speakFunction();
var words = speakFunction();
words;
这是一个很好的例子,单词字符串是“我的名字是Juriy”。但是,如果我改变人物对象
var person = {
name: 'Ryan',
speakFunction: function() {
return 'My name is ' + this.person.name
}
};
我的程序执行错误“TypeError:无法读取未定义的属性'名称”
为什么?
答案 0 :(得分:2)
您的第二个示例需要更改为:
return 'My name is ' + this.name
因为在这种情况下this
已经是person
对象。
以下是对每种情况发生情况的更长解释:
this
的值与声明代码的方式无关,只与调用函数的方式有关。
如果函数只是作为普通函数调用(无论函数是内函数还是全局函数),那么this
将被设置为全局对象或未定义(在严格模式下)
因此,在您的示例中,您必须查看函数的调用方式,因为这决定了this
的值。
实际上,您的示例都没有正确使用this
。第一个仅适用,因为this
设置为window
,因此this.person.name
变为window.person.name
,这仅仅是对全局变量的引用。这甚至不能在strict
模式下运行,因为this
将设置为undefined
(这对于您是否正确使用this
是一个很好的测试。)< / p>
在您的第一个示例中,当您执行此操作时:
var speakFunction = person.speakFunction();
它获得内在功能。
当你这样做时,请执行以下操作:
var words = speakFunction();
你在呼唤那个内在的功能。但是因为你在没有对象引用的情况下调用内部函数,Javascript会将this
设置为全局对象或未定义(在严格模式下)。浏览器中的global
对象为window
。
在你的第二个例子中,当你这样做时:
var speakFunction = person.speakFunction();
它实际上执行speakFunction方法。在该方法中,this
将设置为person
对象,因为您将其称为person.speakFunction()
。但是,您正试图访问:
this.person.name
但this
为person
,因此您正尝试访问:
person.person.name
由于person
本身没有person
属性,因此person.person
未定义,然后您尝试访问undefined.name
这是一个类型错误。
这适用于您的第二个示例(使用this.name
代替this.person.name
):
var person = {
name: 'Ryan',
speakFunction: function() {
return 'My name is ' + this.name
}
};
var result = person.speakFunction();
console.log(result);