是否有充分的理由围绕requireJS模块定义包装一个额外的无限调用函数

Is there a good reason for wrapping an extra immedeately-invoked function around a requireJS module definition?

本文关键字:一个 函数 调用 无限 定义 理由 是否 模块 requireJS 包装      更新时间:2023-09-26

我在GitHub中查看了Backbone requireJS样板,我看到了两种不同类型的实现。

https://github.com/david0178418/BackboneJS-AMD-Boilerplate/blob/master/src/js/views/viewStub.js具有以下视图Stub:

function() {
    "use strict";
    define([
            'jqueryLoader',
            'underscore',
            'backbone',
        ],
        function($, _, Backbone) {
            return Backbone.View.extend({
                template : _.template(/*loaded template*/),
                initialize : function() {
                    this.render();
                },
                render : function() {
                    $(this.el).append(this.template(/*model/collection*/));
                    return this;
                }
            });
        }
    );
})();

而另一个样板的视图存根https://github.com/jcreamer898/RequireJS-Backbone-Starter/blob/master/js/views/view.js具有以下功能:

define([
        'jquery', 
        'backbone',
        'underscore', 
        'models/model',
        'text!templates/main.html'], 
function($, Backbone, _, model, template){
    var View = Backbone.View.extend({
        el: '#main',
        initialize: function(){
            this.model = new model({
                message: 'Hello World'
            });
            this.template = _.template( template, { model: this.model.toJSON() } );
        },
        render: function(){
            $(this.el).append( this.template );
        }
    });
    return new View();
}); 

我的问题是:为什么在第一个例子中,整个RequireJS模块都有一个自执行函数

本例中不需要包含闭包。它创建了一个作用域,这样声明的变量或函数就不会泄漏到全局作用域中。但是,当您不创建变量或命名函数时,就没有什么可泄漏的了。所以没有什么意义。

真正的原因可能比你想象的要简单。就像即使周围没有人也使用转向灯一样,将每个JS源文件封装在一个自执行函数中是一个很好的习惯。它使你免于犯愚蠢的错误。因此,它可能只是防御性编程风格的一个例子。

这个例子没有任何好处,但运行时的相关性能成本完全可以忽略不计。那么,为什么不以"正确"的方式来做,以防有新的人进来并以一些时髦的方式"维护"这个模块呢?

这样做完全没有意义,因为您已经有了一个创建自己名称空间的函数。

此外,还有一个缺点——你得到了一个额外的缩进,所以你的代码变得不那么可读。