2012-03-13 93 views
36
var test = { 
    demo: function(){ 
     //get the caller context here 
    } 
} 
//when this gets called, the caller context should be window. 
test.demo(); 

我試圖arguments.calleearguments.callee.caller,並沒有運氣...是否有可能在javascript中獲取調用者上下文?

+0

「呼叫者上下文」是什麼意思?也許你的意思是它的* this *關鍵字的價值? – RobG 2012-03-13 06:01:59

+0

@ RobG,在我的例子中,它應該是'window',有效地'this'關鍵字在主叫站點。 – 2012-03-13 06:02:56

+0

test.demo.call(window); – cycaHuH 2012-03-13 06:05:19

回答

36

由於this關鍵字referes到ThisBindingLexicalEnvironment和JavaScript(或ECMAScript中)不允許LexicalEnvironment編程訪問的(事實上,沒有編程訪問整個Execution Context),所以它是不可能得到調用者的上下文。

此外,當您在全球範圍內嘗試test.demo(),應該有無來電顯示可言,既不附加背景主叫,這僅僅是一個全球守則,而不是調用上下文。

+0

+1非常有意義 – Sarfraz 2012-03-13 06:04:26

+1

@ otakustay - 關於不能將變量作爲其他變量對象的屬性引用,你是正確的。但作爲一種特殊情況,全局變量是全局對象的屬性,所以如果它是全局的,你實際上可以訪問調用上下文**中的變量。你可以測試(不建議使用的,非標準的)'arguments.callee.caller'屬性,如果它是'null'假設調用來自全局代碼,那麼希望你不在ES5嚴格模式下,獲得對全局對象並從那裏開始。 – RobG 2012-03-13 06:28:36

+0

這是您遇到Node.JS和模塊問題的地方。 – Qix 2014-02-06 08:39:42

4

函數的關鍵字this的值由調用設置,它不是「上下文」。函數有一個執行上下文,其中包括這個的值。它不是由this定義的。

在任何情況下,由於所有的功能有一個this變量,它的可變對象的屬性,你不能,除非它傳遞給函數的引用任何其他this關鍵字範圍。你不能直接訪問變量對象;您取決於作用域鏈上的可變分辨率,所以this將始終是當前執行上下文的this

8

通過上下文,我假設你的意思是this?這取決於函數如何被調用,而不是從何處調用。

例如(使用中的Weblkit控制檯):

var test = { 
    demo: function() { 
     console.log(this); 
    } 
} 
test.demo(); // logs the "test" object 
var test2 = test.demo; 
test2();  // logs "DOMWindow" 
test.demo.apply("Cheese"); // logs "String" 

順便提及,arguments.caller已棄用。

相關問題