Object方法中的“this”关键字指向Window

zhu*_*hou 5 javascript

\r\n
\r\n
var name = \'The Window\';\r\nvar object = {\xe3\x80\x80\xe3\x80\x80\r\n  name: \'My Object\',\r\n  getNameFunc: function(){\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\r\n    return function() {\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\r\n      return this.name;\xe3\x80\x80\xe3\x80\x80\xe3\x80\x80\r\n    };\xe3\x80\x80\r\n  }\r\n};\r\n\r\nconsole.log( object.getNameFunc()() );
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

当我测试代码时。结果就是《窗户》。但我认为this.name;应该是My Object。我的想法出了什么问题。

\n\n

当我在之前添加 var 时name : "My Object",它显示错误。?为什么?

\n

小智 6

this函数内部是调用它的“接收者”。

那是,

  1. 对于该构造x.f()this函数 ( f) 内部将计算出 的值x

  2. 对于所有其他情况,this将评估被window调用函数的内部。(函数callapply、 和bind也可以改变this......但那是另一个故事了。)

在发布的示例中,第二个函数(带有 的函数this.name)不是使用表单调用的,对象也是x.f()如此。thiswindow

“简单的修复”是使用闭包:(第一个函数在表单中调用x.f()因此与this相同,这是预期的。我们通过使用创建的闭包和返回的函数捕获当前作用域中object的值.)thisself

getNameFunc : function () {
    var self = this
    return function () {
        return self.name
    }
}
Run Code Online (Sandbox Code Playgroud)

不过,我可能会考虑另一种设计,具体取决于:)

快乐编码。


补充说明,供评论:

...那是因为您正在使用circle.getArea()which 的形式x.f()。因此,this在 getArea 函数内部计算结果为circle

在发布的代码中,您连续调用两个不同的函数。想象一下这样编写代码:

var nameFunc = object.getNameFunc()
nameFunc()
Run Code Online (Sandbox Code Playgroud)

第一个函数调用采用 的形式x.f(),因此thisgetNameFunc 内部是 的计算object。但是,在第二行中,函数 (nameFunc) 并未形式调用x.f()。因此,this内部 nameFunc (从 getNameFunc 返回的函数)将计算为window,如上所述。