2014-11-02 26 views
0

所有,JS調用棧與上下文

我有一點的代碼,基本上是,

function b(){ 
    console.log(this); 
} 

function a(){ 
    console.log(this); 
    b(); 
} 

Window.call(context, a); 

輸出看起來像:

Object(context) 
Window 

它看起來像非標準上下文只有在調用調用時才保留,所有未指定上下文的子例程將使用原始上下文進行調用。有沒有辦法用上下文調用一個函數,讓它的整個執行堆棧佔據相同的上下文?

感謝,

回答

3

你必須使用.call().apply()

function a(){ 
    console.log(this); 
    b.call(this); 
} 

您不能在運行時翻轉成一個模式,其中它含蓄地這樣做,所以直接回答你的問題是「不」 。

如果你有一大堆的功能,並希望創建總是有一些this特定值的版本,你可以使用.bind()

function b(){ 
    console.log(this); 
} 

function a(){ 
    console.log(this); 
    b(); 
} 

a = a.bind(context), b = b.bind(context); 
a(); // logs context from both functions 

這會是做一個非常不尋常的事情,但它會工作。如果你想用不同的對象來使用函數,你會很失敗。

+0

使用綁定是否具有相同的限制?我正在嘗試編寫一些內部方法不能從課堂外訪問的類。我希望可用的方法能夠調用這些來訪問/更新內部狀態。 – Goldfish 2014-11-02 21:06:01

1

Javascript中有一個簡單的規則。 Javascript中的每個函數調用都會爲this設置一個新值。如果您未進行方法調用,如obj.method()或使用.call().apply(),則this會以嚴格模式設置回全局對象或undefined

所以,如果你想專門控制的this在任的函數調用的值,那麼你將需要使用.call().apply()或者甚至.bind()。有沒有魔術模式,你可以把JavaScript的,將保存「this當你調用其他功能。它只是不這樣工作。

結構上,如果你真的想要的this特定值的多種功能,那麼他們或許應該是一個共同的對象的方法,因爲調用obj.method()將自動設置thisobj或者您可以使用.call().apply()手動指定你希望this的值適用於任何函數調用。

在你的代碼示例,你可以改變:

function a(){ 
    console.log(this); 
    b(); 
} 

這樣:

function a(){ 
    console.log(this); 
    b.call(this); 
} 

而且,b()將與this相同的值a()得到執行。

+0

我不想這樣做的原因是我必須一直使用呼叫。如果B要調用任何其他方法,則必須全部改變以改變上下文。這將使得使用任何庫方法幾乎不可能... – Goldfish 2014-11-02 21:08:40

+0

@Goldfish - 你試圖以某種方式做結構化的事情,對付JavaScript的工作原理。你需要重新思考你想要做什麼來與Javascript的工作方式保持一致。正如我所說的,如果你想讓你所有的函數共享一個共同的'this'值,那麼把它們放在一個對象上,並用'obj.method()'調用它們。這就是JS的工作原理。每個普通函數調用都會重置這個''。除了使用我們概述的方法之外,沒有什麼可以改變這一點。 – jfriend00 2014-11-02 21:44:06