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

Ben LexicalEnvironment içinde ThisBinding için this kelime referes yana arguments.callee ve arguments.callee.caller ve hiç şans ...Arayan içeriği javascript’te almak mümkün mü? hayır, aslında (

+0

"Arayan içeriği" ile ne demek istiyorsunuz? Belki de bu * anahtar kelimesinin değerini mi kastediyorsunuz? – RobG

+0

@ RobG, benim örneğimde, arama penceresinde 'window', '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'olmalıdır. –

+0

test.demo.call (window); – cycaHuH

cevap

36

çalıştı ve javascript (veya ECMAScript) LexicalEnvironment programlı erişim izin vermez Tüm Execution Context için programatik erişim, bu nedenle arayan bağlamını almak için imkansız olduğunu. Eğer bir küresel bağlamda test.demo() çalıştığınızda, hiç arayan ne arayana için ekli bağlamolmalıdır Ayrıca

, bu sadece bir Küresel Kod değil, bir çağrı bağlamdır .

+0

+1 Mükemmel bir anlam ifade eder – Sarfraz

+1

@ otakustay — Değişkenleri diğer değişken nesnelerin özellikleri olarak görememekten kesinlikle habersizsiniz. Ancak, özel bir durum olarak, global değişkenler global nesnenin özellikleri haline getirilmiştir, bu yüzden aslında arama bağlamında değişkenlere erişebilirsiniz. (Amorti edilmemiş, standart olmayan) arguments.callee.caller' özelliği için test edebilirsiniz ve eğer 'null', aramanın global koddan olduğunu varsayıyorsa, o zaman ES5 katı modunda olmadığınızı umarsınız, küresel nesne ve oradan git. – RobG

+0

Bu, Node.JS ve modülleriyle ilgili sorun yaşayacağınız yerdir. – Qix

4

Bir işlevin this anahtar kelimesinin değeri çağrı tarafından belirlenir, "içerik" değildir. İşlevler, numaralı değerini içeren bir yürütme içeriğine sahiptir. this tarafından tanımlanmamıştır.

Her durumda, tüm işlevler, değişken nesnesinin bir özelliği olan this değişkenine sahip olduğundan, işleve iletilmediği sürece kapsam dahilinde başka herhangi bir this anahtar sözcüğünü kullanamazsınız. Değişken nesnesine doğrudan erişemezsiniz; kapsam zincirindeki değişken çözünürlüğe bağlısınız, bu nedenle this her zaman geçerli yürütme içeriğinin this olacaktır.

8

Bağlamında, this mu demek istediniz? Bu, çağrılan yerden değil, işlevin nasıl çağrıldığına bağlıdır. (Webkit konsolu kullanarak) örneğin

:

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" 

arada, arguments.caller kaldırıldı.

İlgili konular