Bu JavaScript deyiminin temeli nedir: var self = this?

Aşağıdakileri bir WebKit HTML 5 SQL Depolama Notları Demo kaynağında gördüm:

 function Note() { var self = this; var note = document.createElement('div'); note.className = 'note'; note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false); note.addEventListener('click', function() { return self.onNoteClick() }, false); this.note = note; // ... } 

Yazar bazı yerlerde (fonksiyon gövdesi) "I" yi ve başka yerlerde (yöntemlerin argüman listesinde tanımlanan fonksiyon gövdeleri) yazarını kullanır. Neler oluyor Şimdi bir kere farkettim, her yerde görmeye başlayacak mıyım?

333
07 июня '09 в 17:59 2009-06-07 17:59 Thomas L Holaday 07 Haziran 09: 17: 17'de sordu 2009-06-07 17:59
@ 10 cevap

Alistapart.com'da bu makaleye bakın

self bağlam değiştiğinde bile, aslına referansta bulunmak için kullanılır. Bu, olay işleyicilerinde (özellikle kapanışlarda) sıkça kullanılan bir tekniktir.

409
07 июня '09 в 18:01 2009-06-07 18:01 Cevap Jonathan Fingland tarafından 07 Haziran 099 tarihinde 06:01 PM tarihinde düzenlendi 2009-06-07 18:01

Bence "self" değişkeninin ismi artık bu şekilde kullanılmamalıdır, çünkü modern tarayıcılar global bir nesneye veya normal bir pencereye veya WebWorker'a işaret eden global bir değişken sağlar .

border=0

Karışıklık ve olası çatışmalardan kaçınmak için, bunun yerine var thiz = this veya var that = this yazabilirsiniz.

92
24 сент. 24 Eylül tarihinde Duan Yao tarafından verilen cevap. 2013-09-24 07:46 '13 07:46 2013-09-24 07:46

Evet, her yerde göreceksin. Bu genellikle that = this; .

Olayların neden olduğu fonksiyonların içinde self nasıl kullandığını görüyor musun? Kendi bağlamlarına sahip olacaklar, bu yüzden Note() da gelen, bunu saklamak için self kullanılıyor.

self için neden hala Note() fonksiyonunun tamamlanmasından sonra gerçekleştirilebilse de, fonksiyonlar için hala geçerlidir, iç fonksiyonların kapatma nedeniyle dış fonksiyonun içeriğini almasıdır .

34
07 июня '09 в 18:03 2009-06-07 18:03 Cevap Nosredna tarafından 07 Haziran 099 'da 18:03 2009-06-07 18:03 tarihinde verilmiştir.

Vario deyimini beğenmezseniz, geri çağırmada this referansı destekleyen alternatif bir proxy modeli olduğu da belirtilmelidir.

Bir işlev function.apply veya function.call kullanarak verilen bir bağlamla çağrılabildiğinden, işlevi kullanarak belirtilen ya da belirtilen bağlamı kullanarak çağıran bir işlev döndüren bir sarmalayıcı yazabilirsiniz. Bu kalıbı uygulamak için jQuery proxy özelliğine bakın. İşte kullanımına bir örnek:

var wrappedFunc = $.proxy(this.myFunc, this);

wrappedFunc çağrılabilir ve sürümünüzü bağlam olarak göreceksiniz.

28
22 нояб. Cevap 22 Kasım'da veriliyor. 2011-11-22 21:03 '11 21:03 2011-11-22 21:03

Bu bir JavaScript jerk. Bir işlev bir nesnenin özelliği olduğunda, daha uygun bir adla ifade edilen yöntem, bu bir nesneyi ifade eder. Örnek olay işleyicide, içeren nesne olayı tetikleyen öğedir. Standart bir işlev çağrıldığında, bu global nesneye atıfta bulunacaktır. İç içe geçmiş işlevleriniz varsa, örneğinizde olduğu gibi, bu , dış işlev bağlamıyla hiç alakalı değildir. Dahili fonksiyonlar alanı içerilen fonksiyonla paylaşır, böylelikle geliştiriciler, bunu kaydetmek için bir dahili fonksiyonda ihtiyaçları olan var.

9
16 марта '15 в 23:42 2015-03-16 23:42 Cevap 16 Mart 15:15 'te 23:42 2015-03-16 23:42

Değişken, yöntemde tanımlanan yerleşik fonksiyonlar tarafından yakalanır. this fonksiyondaki başka bir nesneye atıfta bulunacaktır. Bu şekilde, işlevi this alana bağlantıyı dış alanda tutmaya zorlayabilirsiniz.

9
07 июня '09 в 18:02 2009-06-07 18:02 Cevap Mehrdad Afshari tarafından 07 Haziran 099 'da 18:02 2009-06-07 18:02 tarihinde verilmiştir.

Başkaları tarafından açıklandığı gibi, var self = this; üst alana başvurmak için kodun kapanmasına izin verir.

Ancak, şimdi 2018 ve ES6, tüm büyük web tarayıcıları tarafından yaygın olarak desteklenmektedir. var self = this; deyim eskisi kadar önemli değil.

Şimdi var self = this; okların işlevlerini kullanarak

var self = this kullandığımız durumlarda var self = this :

 function test() { var self = this; this.hello = "world"; document.getElementById("test_btn").addEventListener("click", function() { console.log(self.hello); // logs "world" }); }; 

Şimdi ok işlevini var self = this olmadan kullanabiliriz:

 function test() { this.hello = "world"; document.getElementById("test_btn").addEventListener("click", () => { console.log(this.hello); // logs "world" }); }; 

Ok fonksiyonlarının kendileri yoktur ve sadece sesin çevrelediğini varsayarlar.

6
30 янв. Cevap Elliot B. tarafından verilmiştir. 2018-01-30 05:38 '18, 5:38 201-01-30 05:38

Aslında, ben bir pencere başvurusudur ( window.self ), yani var self = 'something' dediğinizde, kendiniz için pencere başvurusunu geçersiz kılarsınız - çünkü pencere nesnesinde kendin vardır.

Bu nedenle çoğu geliştirici var that = this yerine var self = this;

Her durumda; var that = this; iyi uygulamaların peşinde değil ... kodunuzun diğer geliştiriciler tarafından daha sonra değiştirileceğini veya değiştirileceğini varsayarak, geliştirici topluluğu için en yaygın programlama standartlarını kullanmanız gerekir.

Bu nedenle, var oldThis / var oThis / etc gibi bir şey kullanmalısınız - bölgenizdeki açıklık için // çok fazla değil, fakat birkaç saniye ve birkaç beyin döngüsünden tasarruf edin

5
22 мая '14 в 12:14 2014-05-22 12:14 Cevap 22 Mayıs '14, 14:14 de 04:14 2014-05-22 12:14 tarihinde verilecek.

Birkaç kez belirtildiği gibi, “I”, fonksiyona girmeden önce referansı “this” e kaydetmek için basitçe kullanılır. 'Bu' işlevi bir an önce başka bir şey ifade eder.

0
27 дек. Cevap verilen Cyprien 27 Aralık 2014-12-27 20:54 '14, 20:54 2014-12-27 20:54
 function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; this.getfullname = function () { return '${this.firstname} ${this.lastname}'; }; let that = this; this.sayHi = function() { console.log('i am this , ${this.firstname}'); console.log('i am that , ${that.firstname}'); }; } let thisss = new Person('thatbetty', 'thatzhao'); let thatt = {firstname: 'thisbetty', lastname: 'thiszhao'}; 

thisss.sayHi.call (thatt);

-1
02 авг. Cevabı ht zhao 02 ağustos. 2018-08-02 08:16 18: 08: 16, 2018-08-02 08:16

etiketleriyle ilgili diğer sorular, veya Soru sor