Javascript “覆盖”;这";变量问题或如何调用成员函数?
我在这个类中使用jQuery和:Javascript “覆盖”;这";变量问题或如何调用成员函数?,javascript,jquery,oop,event-handling,prototypejs,Javascript,Jquery,Oop,Event Handling,Prototypejs,我在这个类中使用jQuery和: 毕竟,我如何调用this.updateSum()?您需要使用闭包 initElements: function(sumEl) { this.sumEl = sumEl; var ref = this; sumEl.keyup( function(){ref.updateSumHandler();}); }, 您需要使用闭包 initElements: function(sumEl) { th
毕竟,我如何调用this.updateSum()?您需要使用闭包
initElements: function(sumEl) {
this.sumEl = sumEl;
var ref = this;
sumEl.keyup( function(){ref.updateSumHandler();});
},
您需要使用闭包
initElements: function(sumEl) {
this.sumEl = sumEl;
var ref = this;
sumEl.keyup( function(){ref.updateSumHandler();});
},
这是在
initElements
函数中需要使用的著名Javascript习惯用法:
var that = this;
稍后在处理程序中,只需参考that
,而不是this
:
var MyClass = Class.create({
initElements: function(sumEl) {
this.sumEl = sumEl;
var that = this;
sumEl.keyup(this.updateSumHandler);
},
updateSumHandler: function(event) {
that.updateSum();
},
updateSum: function() {
// does something here
}
});
在Fronteers 2008大会上的关于Javascript闭包的文章中对其进行了详细介绍。这是在
initElements
函数中需要使用的著名Javascript习惯用法:
var that = this;
稍后在处理程序中,只需参考that
,而不是this
:
var MyClass = Class.create({
initElements: function(sumEl) {
this.sumEl = sumEl;
var that = this;
sumEl.keyup(this.updateSumHandler);
},
updateSumHandler: function(event) {
that.updateSum();
},
updateSum: function() {
// does something here
}
});
在Fronteers 2008年会议上的关于Javascript闭包的文章中对其进行了详细介绍。完全未经测试的建议:
sumEl.keyup(this.updateSumHandler.bind(this));
.bind()
返回一个新函数,其中bind
的第一个参数作为函数的上下文被关闭。
它还可以关闭参数,查看
对我来说,Function.bind()
是有史以来用JavaScript编写的最好的函数:)完全未经测试的建议:
sumEl.keyup(this.updateSumHandler.bind(this));
.bind()
返回一个新函数,其中bind
的第一个参数作为函数的上下文被关闭。
它还可以关闭参数,查看
对我来说,Function.bind()
是有史以来用JavaScript编写的最好的函数:)doEvent处理程序传统上是使用它们注册为上下文的元素来调用的。jQuery也是这样做的
最简单的选择是使用jQuery处理事件数据的能力
var MyClass = Class.create({
initElements: function(sumEl) {
this.sumEl = sumEl;
sumEl.bind("keyup", this, this.updateSumHandler);
},
updateSumHandler: function(event) {
// event.data is the initial this
// call updateSum with correct context
event.data.updateSum.call(event.data);
},
updateSum: function() {
// does something here
}
});
另一种可能是使用闭包在构造函数中定义updateHandler
var MyClass = Class.create({
initElements: function(sumEl) {
this.sumEl = sumEl;
// save this as that so we can access it from the anonymous function
var that = this;
sumEl.keyup(function()
{
that.updateSum();
});
},
updateSum: function() {
// does something here
}
});
这是另一个答案试图做的一个工作示例。它之所以有效,是因为匿名函数始终可以访问周围函数中的变量——但只有在函数中真正将“that”定义为局部变量时,它才有效。doEvent处理程序传统上是使用它们注册为上下文的元素/this来调用的。jQuery也是这样做的
最简单的选择是使用jQuery处理事件数据的能力
var MyClass = Class.create({
initElements: function(sumEl) {
this.sumEl = sumEl;
sumEl.bind("keyup", this, this.updateSumHandler);
},
updateSumHandler: function(event) {
// event.data is the initial this
// call updateSum with correct context
event.data.updateSum.call(event.data);
},
updateSum: function() {
// does something here
}
});
另一种可能是使用闭包在构造函数中定义updateHandler
var MyClass = Class.create({
initElements: function(sumEl) {
this.sumEl = sumEl;
// save this as that so we can access it from the anonymous function
var that = this;
sumEl.keyup(function()
{
that.updateSum();
});
},
updateSum: function() {
// does something here
}
});
这是另一个答案试图做的一个工作示例。它之所以有效,是因为匿名函数始终可以访问周围函数中的变量——但只有在函数中真正定义了“that”作为局部变量时,它才有效。+1<代码>函数.bind
将是未来版本JavaScript的标准语言功能。+1<代码>函数.bind
将成为未来版本JavaScript的标准语言功能。不,为什么?它是一个闭包,所以应该在updateSumHandler的作用域中。但是没有测试代码。没有,为什么?它是一个闭包,所以应该在updateSumHandler的作用域中。但是没有测试代码。