var name = "Window Object";
var a = {
name: 'manish',
getName: function() {
return this.name;
}
}
b = (a.getName = a.getName)();
console.log(b, window);
以上是我在JSFiddle上编写的代码。
以下是链接:https://jsfiddle.net/shettyrahul8june/o49jn5fm/
变量b 返回结果,而不是窗口对象。我在Window对象中看到有一个名为 name 的属性,其结果存储为字符串。但我不确定为什么我的全局变量不会覆盖该变量。感谢您的期待。
编辑:伙计我认为我的问题并不清楚。我知道它引用了JSFiddle的窗口对象的名字。但我也写了 var name =" Window Object" 。
为什么我的变量名称没有超过Window对象名称,因为我认为我声明的var名称应该附加到window对象。是因为,小提琴有一个包装器对象,其名称被分配为
JSFiddleWrapper = { name:" Window Object" }
因此它引用了window.name?
答案 0 :(得分:2)
当你做a.getName = a.getName
时,有一些有趣的事情。 a.getName
函数被重新分配给它。括号只返回该函数,其中Window
作为其上下文。因此,当您在函数this
内部时,它会引用Window对象。
var name = "Window Object";
var a = {
name: 'manish',
getName: function() {
return this.name;
}
}
b = (a.getName = a.getName)();
console.log(b);
您可以使用bind
更改上下文。请查看以下代码段:
var name = "Window Object";
var a = {
name: 'manish',
getName: function() {
return this.name;
}
}
b = (a.getName = a.getName).bind(a)();
console.log(b);
答案 1 :(得分:2)
在JavaScript中,this
的行为与大多数其他语言截然不同。它的精确行为完全取决于函数的调用方式,注意:
console.log(a.getName(), window); // manish Window
这从name
正确获取a
,因为this
被推断为引用期间左侧的对象。但是在这里:
f = a.getName;
console.log(f(), window); // result Window
函数f
在某种意义上来说就是在调用它时从对象“未绑定”,因此this
被推断为引用Window本身(在JSFiddle中{{1}结果面板中窗口的name
}。
解决此问题的一种相当简单的方法是使用bind
方法:
'result'