另一个函数中的内部函数是某个对象中的闭包

时间:2014-10-11 19:44:20

标签: javascript web

“如果在另一个函数中有内部函数,则此变量引用全局对象(通常是窗口)” - 引自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:无法读取未定义的属性'名称”

为什么?

1 个答案:

答案 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

thisperson,因此您正尝试访问:

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);