2012-08-05 57 views
2

如果你有下面的代碼:範圍的這種

var global = this; 
function A() { 
    function B() { 
     return this; 
    } 
    return B(); 
} 
var C = new A(); 
C === global // true 

爲什麼在函數B的this指的是全球空間而不是對象A的this

+0

除了@ Pointy的回答,你可以看到這個[技術在這裏的實踐](http://stackoverflow.com/questions/11814953/what-is-the-difference-in-the-invocation-of-this-in-這些-例子)。 (第二個代碼片段) – phant0m 2012-08-05 13:36:08

回答

3

每個函數調用都會確定this的值。因爲B在沒有任何上下文的情況下被調用,所以this的值是全局對象。

它可以通過簡單地複製它保留this在外部方面:

function A() { 
    var x = this; 
    function B() { 
    return x; 
    } 
    return B(); 
} 
0

陪尖尖的正確答案:

這樣做的原因是因爲你可以做任何你想要的功能。 您可以從函數A返回函數B,並將其保存爲全局變量。

或者您可以將函數B作爲方法附加到一個對象或十幾個對象。 或者您可以在AJAX回調中使用它,或者將它用作定時器的回調。

因爲引擎不知道函數B會發生什麼,所以該語言表示this指的是在調用函數時調用的任何函數。

這給語言增加了很多活力,但如果您不確定在任何給定時間指向的是什麼,它也會增加很多頭痛。

規則拇指:

如果函數是直接連接作爲一個對象的方法,或一個函數被調用時.call.apply並且被進給的情況下,像myFunc.call(myObj),然後this指的是window

+0

感謝所有答覆。我非常感謝你的時間。我現在知道了。 – 2012-08-06 18:36:23

2

this與範圍無關,它不是一個變量。這是一個關鍵字,用於評估當前正在執行的函數的對象上下文。函數的對象上下文由您如何調用它決定。功能定義的位置或方式無關緊要。

當您調用像fn()這樣的函數時,它不在對象上下文中,並且該語言錯誤地嘗試解決該問題,因爲它應該只是在僅看到this時拋出一個錯誤。在嚴格模式下,它會在某種程度上修正爲undefined

當您將函數作爲某個對象I.E.的屬性調用時obj.fn()然後obj針對該呼叫綁定到this

因爲它是笨重具有的功能附加到某個對象只是爲了獲得呼叫對象的權利方面,所有功能繼承.call方法,使您可以顯式指定對象上下文:

return B.call(this);