Javascript 另一个函数中的内部函数,该函数是某个对象中的闭包
“如果在另一个函数中有一个内部函数,则此变量引用全局对象(通常为窗口)”--引用自 问题是这个案子发生了什么? 我举了一个例子:Javascript 另一个函数中的内部函数,该函数是某个对象中的闭包,javascript,web,Javascript,Web,“如果在另一个函数中有一个内部函数,则此变量引用全局对象(通常为窗口)”--引用自 问题是这个案子发生了什么? 我举了一个例子: var person = { name: 'Juriy', speakFunction: function() { return function() { return 'My name is ' + this.person.name } } }; var speakFunction = person.speakF
var person = {
name: 'Juriy',
speakFunction: function() {
return function() {
return 'My name is ' + this.person.name
}
}
};
var speakFunction = person.speakFunction();
var words = speakFunction();
words;
这是一个很好的例子,字符串是“我的名字是Juriy”。但是如果我这样改变person对象
var person = {
name: 'Ryan',
speakFunction: function() {
return 'My name is ' + this.person.name
}
};
我的程序执行时出现错误“TypeError:无法读取未定义的属性'name'”
为什么?您的第二个示例需要更改为:
return 'My name is ' + this.name
因为在这种情况下,this
已经是person
对象
下面是对您的每种情况的详细解释:
this
的值与代码的声明方式无关,只与函数的调用方式有关
如果函数只是作为普通函数调用(无论该函数是内部函数还是全局函数),则此
将设置为全局对象或未定义(在严格模式下)
因此,在您的示例中,您必须查看函数是如何调用的,因为这是决定this
值的因素
实际上,您的两个示例都不是此的正确用法。第一个选项之所以有效,是因为
this
被设置为window
,所以this.person.name
变成了window.person.name
,它只是对全局变量的引用。这甚至不能在严格
模式下工作,因为此
将被设置为未定义
(这是一个很好的测试,可以测试您是否正确使用此
)
在第一个示例中,执行此操作时:
var speakFunction = person.speakFunction();
它获取内部函数
然后,请执行以下操作:
var words = speakFunction();
您正在调用该内部函数。但是,由于您在没有对象引用的情况下调用该内部函数,Javascript会将this
设置为全局对象或未定义(在严格模式下)。浏览器中的全局
对象是窗口
在第二个示例中,当您执行以下操作时:
var speakFunction = person.speakFunction();
它实际上执行speakFunction方法。在该方法中,此
将被设置为个人
对象,因为您将其称为个人.speakFunction()
。但是,您正在尝试访问:
this.person.name
person.person.name
但是此
是个人
,因此您试图访问:
this.person.name
person.person.name
由于person
本身没有person
属性,person.person
未定义,然后您尝试访问undefined.name
,这是一个类型错误
这适用于第二个示例(使用This.name
而不是This.person.name
):
增加了额外的解释。重点是在构造函数对象时创建的上下文。非常感谢,jfriend00@Juriy-我希望您不要认为
这个
是根据函数对象的声明方式设置的,因为事实并非如此。这就是我试图解释的函数调用方式。更多信息请参见。当然我不是:)这与你的答案完全相反。Thnx for href,我会读的。我认为引号是错误的。this
的值取决于函数的调用方式,而不是函数的定义方式/位置。查看MDN文档以了解有关此的更多信息:Thanx,Felix寻求帮助