JS关闭的麻烦

时间:2011-04-05 17:23:48

标签: javascript oop closures

我有这个js:

(function () {

    Namespace = {

        settings: {
            myVar: 'test' 
        },

        init: function() {

            var memberSearchFrm = document.getElementById('memberSearch');
            memberSearchFrm.onsubmit = function() {

                this.someOtherFunction(); // doesn't work
                console.log(this.settings.myVar); // doesn't work 
            }
         },

        someOtherFunction: function() {
            console.log('test');  
        }
    }

    Namespace.init();
})();

当我进入onSubmit函数时,我正在丢失'this'的上下文。你能帮助我理解为什么会发生这种情况以及如何解决这种情况吗?

3 个答案:

答案 0 :(得分:3)

尝试这个技巧。

在你关闭之前设置一个名为'that'的变量。

var that = this;

然后在关闭时使用它。您遇到的问题是闭包是附加到您的DOM节点而不是您的对象。因此,当您调用闭包时,它具有DOM节点的值。

答案 1 :(得分:3)

memberSearchFrm.onsubmit内,this引用memberSearchFrm,而不是您想要的对象。您需要保存对this的引用。

    init: function() {
        var that = this;
        var memberSearchFrm = document.getElementById('memberSearch');
        memberSearchFrm.onsubmit = function() {
            that.someOtherFunction();
            console.log(that.settings.myVar); 
        }
     },

答案 2 :(得分:1)

我遇到了与闭包相同的问题,并试图用不同的方法来尝试在闭包中调用其他函数。

http://jsfiddle.net/7FzEz/5/

我最终以这种格式确定了:

(function () {

     var obj = {

        settings: {
            myVar: 'test' 
        },

        init: function() {

            var memberSearchFrm = document.getElementById('memberSearch');
            memberSearchFrm.onsubmit = function() {

                obj.someOtherFunction(); 
                console.log(obj.settings.myVar);  
            }
         },

        someOtherFunction: function() {
            console.log('test');  
        }
    }

    obj.init();
})();