Javascript “覆盖”;这";变量问题或如何调用成员函数?

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

我在这个类中使用jQuery和:


毕竟,我如何调用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的作用域中。但是没有测试代码。