2012-04-14 20 views
6

Aşağıdaki kodu alıyorum ve son satırı nasıl çalıştıracağınızı merak ediyorum. Adsız kullanım sözleşmesi olarak eklenen ve arc.view. $ Işlev_adı gibi bir şey kullanmak yerine kullanacağımız bir api seti ekledim. thxjavascript pencere nesnesinde bir işlevi çağırıyor

var arc={}; 
arc.view={ 
    say_hello: function(){ 
    alert("I want to say hello"); 
    } 
} 
function say_goodbye(){ 
    alert("goodbye to you"); 
} 

arc.view.say_hello(); // works 
window['say_goodbye'](); // works 
// possible to make this work? 
window['arc.view.say_hello'](); 
+2

Senin yüzünden tüm zorlu günlerimi başarı ile bitiriyorum ... teşekkürler +1 –

+0

@vikasdevde :) Yaşasın ... +1 – agpt

cevap

10
window['arc']['view']['say_hello'](); 

veya

window.arc.view.say_hello() 

veya
window['arc'].view['say_hello']() 

nokta sözdizimi veya çalışacak braket sözdizimi Ya

. Nokta sözdizimi, yalnızca bir ayraç tabanlı özellik araması için sözdizimsel şekerdir, bu nedenle yukarıdaki kod parçacıklarının tümü aynıdır. Özellik adı bir dinamik değer olduğunda veya nokta sözdiziminde özellik adını kullanırken bir sözdizimi hatasına neden olduğunda, parantez sözdizimini kullanın. Ör: aslında penceresinde bir işlevi gerçekleştirmek için soruyorsun köşeli ayraç notasyonu kullanarak

jsFiddle

window["arc"]["view"]["say_hello"](); 
3

bu deneyin arc.view.say_hello olarak adlandırıldı, ve view nesnesindeki bir işlev değil (bu, arc nesnesinin bir özelliğidir). Daha açık olmak için:

window["arc.view.say_hello"] = function() { alert("hi") }; 

window["arc.view.say_hello"](); // "hi" 

Eğer anlatılan şekilde bir işlevi çağırmak için isterseniz, nesneler zinciri "çözmek" için var. Bunun için bir yardımcı işlev oluşturabilirsiniz. gibi bir şey: Ayrıca yarar işlevini genişletmek olabilir

var arc={}; 
arc.view={ 
    say_hello: function(){ 
    alert("I want to say hello"); 
    } 
} 
function say_goodbye(){ 
    alert("goodbye to you"); 
} 

function call(id) { 
    var objects = id.split("."); 
    var obj = this; 

    for (var i = 0, len = objects.length; i < len && obj; i++) 
     obj = obj[objects[i]]; 

    if (typeof obj === "function") 
     obj(); 
} 

call("say_goodbye"); 
call("arc.view.say_hello"); 

arguments kullanmak (veya sadece işleve başvuru geri dönebilirler).

2

:

var dynamicMethodName = someObject.getMethodName(); 
someOtherObject[dynamicMethodName](); 

veya

someOtherObject["a key string with spaces and {special characters}"](); 
İlgili konular