1

这是一个抽象的 JavaScript 代码示例,它说明了导致我在这里提出问题的情况:

function className (){    
    var private_variable = 0;        
    function privateMethod(){
        // Some irrelevant code.
    };    
    this.privilegedMethod = function (){
        // Some relevant code to determine if private variable needs to be modified.
        private_variable+=val;    // Modifies private variable.
    };    
    this.init = function () {
        $(window).keydown(function (key) {
            if (key.which == 13) {
                privateMethod();    // Call to private method works fine.
                this.privilegedMethod();    // 'this' references Window object,
                                            // not this class method as expected.
            }
        });
    };  
};

我的问题是 - 是否有另一种方法可以调用 this.privilegedMethod() 引用它的类,而不是它应用到的 Window 对象?

或者也许有任何建议我可以如何重组我的代码以保持功能 - 全局监听关键事件,修改私有变量的方法可以在类外部访问,但私有变量本身不是。

PS 在私有内部调用特权方法并没有改变任何东西。

4

3 回答 3

5
this.init = function () {
    var that = this;
    $(window).keydown(function (key) {
        if (key.which == 13) {
            privateMethod();
            that.privilegedMethod();
        }
    });
};  

或者

this.init = function () {
    $(window).keydown($.proxy(function (key) {
        if (key.which == 13) {
            privateMethod();
            this.privilegedMethod();
        }
    }, this));
};  
于 2012-02-11T12:38:27.793 回答
1

交易是在 keydown 处理程序内部,范围是窗口对象,所以“this”关键字指的是没有你方法的窗口。

詹姆斯解决方案应该可以正常工作。

于 2012-02-11T12:41:43.627 回答
0
function className (){    
    var private_variable = 0;        
    function privateMethod(){
        // Some irrelevant code.
    };    
    this.privilegedMethod = function (){
        // Some relevant code to determine if private variable needs to be modified.
        private_variable+=val;    // Modifies private variable.
    };    

    this.init = function () {
        var handle = $.proxy(this.privilegedMethod, this);
        $(window).keydown(function (key) {
            if (key.which == 13) {
                privateMethod();    
                handle();                                                 
            }
        });
    };  
};

http://api.jquery.com/jQuery.proxy/

于 2012-02-11T12:45:21.567 回答