2016-08-04 77 views
1
var name = "Window Object"; 

var a = { 
    name: 'manish', 
    getName: function() { 
    return this.name; 
    } 
} 

b = (a.getName = a.getName)(); 

console.log(b, window); 

上面是我写在JSFiddle上的代码。为什么我的全局变量在JSFiddle上被覆盖?

这里是链接:https://jsfiddle.net/shettyrahul8june/o49jn5fm/

变量b返回结果,而不是窗口对象。我看到在Window对象中有一个名为的名称为的属性,其结果存储为字符串。但我不知道为什么我的全局变量a没有覆盖该变量。感谢预期。

编辑:伙计们,我想我不清楚我的问题。我知道它是从JSFiddle引用窗口对象的名字。但我也写了var name =“窗口对象”

为什么我的变量名称没有超过窗口对象名称,因为我认为即使已声明的var名称也应该附加到窗口对象。是不是因为,小提琴具有这样的名字被分配了类似的

JSFiddleWrapper =一个包装对象{ 名称:“窗口对象” }

,因此它引用window.name?

+2

要调用没有它的背景下'a.getName',所以它默认为'window',一个在的jsfiddle'窗口.name'是'result'。你的代码是多余的,只要'b = a.getName()',当然? –

+0

比较[在严格模式下的相同代码](https://jsfiddle.net/o49jn5fm/1/) –

+0

@NiettheDarkAbsol我知道这是多余的。我正在测试“this”在写入时的行为(a.getName = a.getName)(); ;) –

回答

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

2

在JavaScript中,this行为与大多数其他语言有很大不同。其精确的行为完全取决于该函数的调用,注意:

console.log(a.getName(), window); // manish Window 

这正确会从aname,因为this推测指代对象上期的左侧。但在这里:

f = a.getName; 
console.log(f(), window); // result Window 

功能,f,是从当时的对象感“绑定”这就是所谓的,所以this推测指窗口本身(的jsfiddle窗口name在结果面板中是'result')。

一个相当简单的方法来解决这个问题是使用bind方法:

b = (a.getName = a.getName.bind(a))(); 
console.log(b, window); // manish Window 
+0

哇几乎相同的答案在同一时间... :)是啊''绑定','调用'或'应用'可以用来改变上下文。 – Ayan

+1

@Ayan yup。非常类似的问题描述和提出的解决方案。 (1) –

相关问题