JavaScript'te, this
anahtar sözcüğü, bir işlevin çağrıldığı context
erişim noktasına erişmek için kullanılır. Javascript'teki işlevler, 'use strict'
bayrağı geçerli kapsamda ayarlanmadığı sürece, .methodName()
sözdizimini kullanarak veya kullanmadan bunları çağırıp çağırmamanız bağlamında her zaman çağrılır. 'use strict'
bayrak ayarlanmadığı sürece
myFunction()
bağlam küresel pencere nesnesi olmaya çalışma zamanı tarafından kabul edilir (bu durumda bağlam olacaktır: bir işlev böyle bir bağlam olmadan çağrılır
undefined.)
Not: ES6'yı Babel gibi bir aktarıcıyla kullanırken, çıktıda varsayılan olarak katı mod ayarlanır.
Bir işlevin bir başvurusu bir nesneye kaydedildiğinde, bu işlevi nokta sözdizimini kullanarak 'bu' bağlamı olarak nesneyle birlikte çağırabilirsiniz.
var myObj = {
myFunc: function(){}
};
// myFunc invoked like this, the value of 'this' inside myFunc will be myObj.
myObj.myFunc();
'bu' işleyin:
Çağrı ve
Hep .call veya .apply yöntemlerle onu çağırarak bir fonksiyonu bağlamını değiştirebilirsiniz uygulayın. Bu durumda, sizin tarafınızdan çağrılmayan, ancak setTimeout işlevi tarafından çağrılan anonim bir işleve sahipsiniz. Bu nedenle, .call veya .apply'dan yararlanamayacaksınız.
Bind
Bunun yerine, .bind yöntemini kullanarak Özel bir bağlam sahip yeni işlev oluşturabilirsiniz. .bind() işlevini anonim işlevinize çağırarak, özel içeriğinizin 'buna' bağlı olduğu yeni bir işlev döndürülür. Bu şekilde özel bağlı fonksiyonunuzu setTimeout'a veri olarak geçirebilirsiniz. Anonim işlevin içinde 'this' anahtar sözcüğünün doğru değere bağlı olması gerekir. 'Bu'
Sözcük:
ES6 olarak, fakat, ok fonksiyonu 'bu' değişiklikle ilgili kurallar kullanırken. Eğer bu sözdizimini kullanırsanız, 'bu' bağlamının mevcut kapsamda olduğu gibi aynı kalacağını göreceksiniz.
setTimeout(() => {
// Hey I can access 'this' in here!
}, 1000);
bir başvuru Kaydetme:
Eğer Babel derlenen çıkışta bakarsanız Babil benzeri _this1, _this2 ve birlikte 'bu' başvurular kaydederek bağlamda izler göreceksiniz.
var self = this;
setTimeout(function(){
self.http.post...
});
Umut bu yardımcı olur:
Kendinizi sadece yeni bir değişken bildirmek Bu yöntemi kullanmak için ve bu yüzden gibi anonim işlevi içinde kullanmaktan değere erişmek (o kadar da 'veya 'kendini' kullanmak yaygındır) .
Daha fazla açıklama için developer.mozilla.org adresinin good article describing the behavior of 'this' inside a functions scope vardır.
Bu 'bağlam' çünkü: http://stackoverflow.com/questions/2130241/pass-correct-this-context-to-settimeout-callback – nikoskip
Bu soruya gerçekten cevap vermek için 4 cevaba gerçekten ihtiyacımız var mı? "Bu" bağlamı "uygun" almak için ok işlevini kullanın? –
@MarkRajcok evet, 3 cevap ile yeterli değil! –