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寻求帮助