Bir yöntemi (yani bir nesneye atanan işlev) yürüttüğünüzde, içinde this
bu nesneye başvurmak için değişken kullanabilirsiniz , örneğin:
var obj = {
someProperty: true,
someMethod: function() {
console.log(this.someProperty);
}
};
obj.someMethod(); // logs true
Bir nesneden diğerine bir yöntem atarsanız, this
değişkeni yeni nesneyi ifade eder, örneğin:
var obj = {
someProperty: true,
someMethod: function() {
console.log(this.someProperty);
}
};
var anotherObj = {
someProperty: false,
someMethod: obj.someMethod
};
anotherObj.someMethod(); // logs false
Başka bir nesneye requestAnimationFrame
yöntemi atadığınızda da aynı şey olur window
. Bunun gibi yerel işlevler, onu başka bağlamda yürütmeye karşı yerleşik bir korumaya sahiptir.
Bir Orada Function.prototype.call()
başka bir bağlamda bir işlevi çağırmak için izin verir fonksiyonu. Bu yöntemin ilk parametresi olarak (bağlam olarak kullanılacak nesne) iletmeniz yeterlidir. Örneğin alert.call({})
verir TypeError: Illegal invocation
. Ancak, iyi alert.call(window)
çalışır, çünkü şimdi alert
orijinal kapsamında yürütülür.
Eğer kullanırsanız .call()
o şekilde nesneyle:
support.animationFrame.call(window, function() {});
gayet iyi çalışıyor, çünkü nesneniz yerine onun yerine requestAnimationFrame
yürütülüyor window
.
Ancak, .call()
bu yöntemi her aramak istediğinizde kullanmak çok şık bir çözüm değildir. Bunun yerine kullanabilirsiniz Function.prototype.bind()
. Buna benzer bir etkiye sahiptir .call()
, ancak işlevi çağırmak yerine, her zaman belirtilen bağlamda çağrılacak yeni bir işlev oluşturur. Örneğin:
window.someProperty = true;
var obj = {
someProperty: false,
someMethod: function() {
console.log(this.someProperty);
}
};
var someMethodInWindowContext = obj.someMethod.bind(window);
someMethodInWindowContext(); // logs true
Bunun tek dezavantajı, IE <8'de desteklenmeyenFunction.prototype.bind()
ECMAScript 5'in bir parçası olmasıdır . Neyse ki, MDN'de bir çoklu dolgu var .
Muhtemelen anladığınız gibi, .bind()
her zaman requestAnimationFrame
bağlamında yürütmek için kullanabilirsiniz window
. Kodunuz şöyle görünebilir:
var support = {
animationFrame: (window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame).bind(window)
};
Sonra sadece kullanabilirsiniz support.animationFrame(function() {});
.