为什么我的全局变量在JSFiddle上被覆盖?

时间:2016-08-04 16:04:26

标签: javascript

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?

2 个答案:

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