0

我想从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);
            }
        });

    }
}
4

2 回答 2

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);
            }
        });

    }
}
于 2012-11-21T20:14:36.187 回答
1

您需要对 foothis内部的 foo 的引用,但是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);
            }
        });

    }
于 2012-11-21T20:16:33.233 回答