2016-03-28 20 views
-1

Burada görüldüğü gibi How to access the correct `this` context inside a callback? Bunun yerine kendini kullanmayı deneyin. JS hakkında biraz aptalca bir soru ama bazı açıklamalar istiyorum ve bunu doğru yapmak için ne yapmalıyım.JS bu ve kendiniz çalışmıyor

(function (global) { 

    "use strict"; 
    var self = this; 

    function onDeviceReady() { 
     self.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(self.test); 
    } 
})(window); 

Ve işe yaramıyor :) Neyi yanlış yapıyorum? Btw Cordova içinde bu kod kullanıyorum .. hata şu

Uncaught TypeError: Cannot set property 'test' of undefined 
+2

Bu şeyin ne olduğunu düşünüyorsunuz? –

+0

Bu fonksiyonlar arasında param kullanmamaları arasında bir şeyleri paylaşmanın bir yöntemi olmasını bekler miydim? : D – user2391356

+0

Bunun yerine bir 'closure' kullanın ya da' use use' komutunu kaldırın. SıkıĢtırmak '' '' ile '' '' 'ye erişmenizi sağlayacaktır. –

cevap

7

strict modunu bir de this değerini kullanarak normal işlev çağrısı undefined. Durumun tam olarak budur. İşleviniz:

(function (global) { 

    "use strict"; 
    var self = this; 
    ... 

})(window); 

yüzden this tanımsız olacaktır sadece normal işlev çağrısı mı. strict modunu kullanmıyorsanız, normal bir işlev çağrısında this genel nesneye ayarlanacaktır. Aksi halde, this, işlev yalnızca başka bir yolla çağrıldığında benzersiz bir değere ayarlanır (new, .apply() veya .call() veya obj.method()'da olduğu gibi).


self iş çevresinde this zaten istenen nesneye işaret ve geri çağrıları daha sonra kullanmak üzere referansı kaydetmek istediğiniz kullandığınız durumlar içindir. Kodunuzda bu durum söz konusu olmadığından ve kodunuzda this'u kullanmayı beklediğinizden net olmadığı için, hangi nesneyi denediğiniz konusunda daha fazla açıklama yapmadan sorununuzu çözmeniz önerilir. referans.

Sadece genel nesneyi referans almak istiyorsanız, kodunuzda yalnızca global.test referansını kullanabilirsiniz. Eğer başka bir nesneye işaret etmek this bekliyoruz

(function (global) { 

    "use strict"; 

    function onDeviceReady() { 
     global.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(global.test); 
    } 
})(window); 

, o zaman işaret etmek onu bekliyorsanız açıklamak zorunda kalacak ve o zaman nasıl belirli belirtmeyi bir fikir sunabilir nesne.


sadece işlerin yapmak için "use strict"; çıkarmayın. strict modunu kullanırken kodunuzun düzgün çalışmadığı gerçeği, kodunuzun strict kipinin korunmak üzere tasarlandığı kötü bir uygulama kullandığı anlamına gelir. Bunun yerine, strict modunu kullanmaya devam etmeli ve bunun yerine kötü uygulamayı kullanmayı durdurmak ve strict moduyla düzgün şekilde çalışmak için kodunuzu düzeltmeniz gerekir. İleride


, görebilmek için Javascript bir işlev çağrısı içeriye this ayarlamak konuya ilişkin bir karar öğrenmek istiyorsanız, bu cevabı okuyabilirsiniz: When you pass 'this' as an argument. Bu cevap, this değerinin belirlenmesinin beş farklı yolunu listeler.

1

Sadece "use strict"; hattını kaldırmak geçerli:

(function (global) { 
    var self = this; 

    function onDeviceReady() { 
     self.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(self.test); 
    } 
})(window); 

Fiddle

+0

LOL! Çok kolay .. ahah teşekkürler! :) Bunu neden unuttum bilmiyorum – user2391356

+0

@ user2391356 no prob! :) – PDKnight

+0

@ user2391356 - Bu kötü bir öneridir ve yapılmamalıdır. '' Kullanımı sıkı ''kullanmak iyidir. Ve bunu kaldırırken kodunuzu çalışır hale getirir, bu da kodunuzun 'sıkı' modun sizi koruduğu kötü uygulamaları kullandığı anlamına gelir. Kod yerine "kullanın sıkı" 'ile çalışmak için düzeltilmelidir. – jfriend00