2016-08-04 81 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) –

相關問題