0

在处理 jQuery 选项对象时,我应该每次都引用“全局”ResponsiveMenu 还是在每个模块中创建我需要的选项的“本地”副本?

看看代码,让我知道你认为哪个最好,为什么,或者它是否重要。我一直这样做的方式是:如果我多次使用参考,我会制作一个“本地”副本。如果我只使用一次,我会引用“全局”的。

ResponsiveMenu = {

    init: function(options, elem) {
        this.options = $.extend( {}, this.options, options );
        this.elem = $(elem);

        this.bindEvents();

        return this;
    },

    options: {
        trigger: null,
        activeClass: 'active',
        submenuTrigger: $('.sub-toggle')
    },

    bindEvents: function() {
        var self = this;

        this.options.trigger.on('click', triggerMain(evt, self));
    },

    triggerMain: function(evt, self) {
        evt.preventDefault();

        var activeClass = self.options.activeClass;

        self.elem.toggleClass(activeClass);
        self.options.trigger.toggleClass(activeClass); //"Global" reference

    },
}

或这个:

bindEvents: function() {
    var self = this,
        trigger = this.options.trigger; //"Local" copy

    trigger.on('click', triggerMain(evt, self, trigger));
},


triggerMain: function(evt, self, trigger) {
    evt.preventDefault();

    var activeClass = self.options.activeClass;

    self.elem.toggleClass(activeClass);
    trigger.toggleClass(activeClass);

},
4

1 回答 1

1

这看起来主要是一个风格问题。通常,如果我需要多次访问同一个值,我只定义一个变量。引用函数时,您还会遇到范围问题。例如在这种情况下:

var obj = {
    num: 2,
    trigger: function() {
        console.log(this.num);
    }
}

obj.trigger();

它将记录2到控制台,因为该函数被绑定obj为范围。如果你这样做

var t = obj.trigger;
t();

但是,您会得到undefined,因为函数的默认范围是window对象。在 ECMAScript 5 中,您可以告诉将函数绑定到的内容,如下所示:

var t = obj.trigger.bind(obj);
t();

现在将记录2.

于 2013-09-09T16:00:31.240 回答