事件處理程序自動將this
關鍵字指向事件觸發的元素。 ECMA-262第5版試圖通過實現的功能「結合」特定對象的舊技術,以打擊這樣的情況:
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
用法:
function MyClass(){
this.init = function(input){
this.input.onkeyup = (function(){
this.change();
}).bind(this);
}
}
的ECMAScript實現是一樣的PrototypeJS implementation(代碼如上)。
你也可以實現它在每個階級基礎:
function MyClass(){
this.bind = function(){
var args = Array.prototype.slice.call(arguments),
self = this,
fn = args.shift();
return function(){
return fn.apply(self,
args.concat(Array.prototype.slice.call(arguments)));
};
};
this.init = function(input){
this.input.onkeyup = this.bind(function(){
this.change();
});
}
}
兩個古老的;-)選擇是隻是一個參考存儲this
功能之外:
function MyClass(){
var self = this;
this.init = function(input){
this.input.onkeyup = function(){
self.change();
}
}
}
若本成爲使用閉包的首選方式? – 2010-07-13 11:50:15
@Felix Kling:我當然這麼認爲,特別是如果你做了很多。無論如何,我都添加了封閉解決方案,以使答案更完整。 – 2010-07-13 11:53:19
謝謝!所有的好方案。現在我想繼續使用古代版本,因爲它只在我需要它的地方。 – Martin 2010-07-13 13:01:45