如何从JS中的侦听器函数中访问对象

时间:2012-11-21 20:11:18

标签: javascript

我想从 require()函数的成功侦听器中访问 foo.settings.debug 对象。我一直得到一个未定义的错误,当我引用“this”时,它最终引用了ajax对象。请协助。

var foo = {

    info: {

        version: '0.0.1'

    },

    settings: {

        debug: true

    },

    require: function(script) {

        $.ajax({
            url: script,
            dataType: "script",
            async: false,
            success: function(){
                if(foo.settings.debug) console.log('loaded js file: ' + script);
            },
            error: function(){
                throw new Error("Could not load script " + script);
            }
        });

    }
}

2 个答案:

答案 0 :(得分:1)

每个函数都有自己的this对象上下文。可以使用apply或其他此类函数更改上下文。

在这种情况下,通过创建匿名函数作为成功回调,您将输入新的上下文。要访问上一个上下文,您需要在上一个上下文中定义一个变量(名称不会被回调函数的参数名称覆盖)。

var foo = {

    info: {

        version: '0.0.1'

    },

    settings: {

        debug: true

    },

    require: function(script) {
        /* every function has its own 'this' context */
        var self = this;

        $.ajax({
            url: script,
            dataType: "script",
            async: false,
            success: function(){
                if(self.settings.debug) console.log('loaded js file: ' + script);
            },
            error: function(){
                throw new Error("Could not load script " + script);
            }
        });

    }
}

答案 1 :(得分:1)

你需要在foo里面引用foo this,但this将成为你封闭内的其他东西,所以你需要保持对this的引用,如此:

require: function(script) {
        var self = this;
        $.ajax({
            url: script,
            dataType: "script",
            async: false,
            success: function(){
                if(self.settings.debug) console.log('loaded js file: ' + script);
            },
            error: function(){
                throw new Error("Could not load script " + script);
            }
        });

    }