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当我测试代码时。结果就是《窗户》。但我认为this.name;应该是My Object。我的想法出了什么问题。
当我在之前添加 var 时name : "My Object",它显示错误。?为什么?
小智 6
this函数内部是调用它的“接收者”。
那是,
对于该构造x.f(),this函数 ( f) 内部将计算出 的值x。
对于所有其他情况,this将评估被window调用函数的内部。(函数call、apply、 和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,如上所述。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |