Есть ли веская причина для того, чтобы обернуть дополнительную вызванную функцию вокруг определения модуля requireJS? - PullRequest
5 голосов
/ 11 января 2012

Я смотрел на шаблоны Backbone-requireJS в GitHub, я вижу два разных типа реализаций.

https://github.com/david0178418/BackboneJS-AMD-Boilerplate/blob/master/src/js/views/viewStub.js имеет следующее как viewStub:

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 выполняется самовыполняющаяся функция?

Ответы [ 2 ]

1 голос
/ 25 января 2012

В этом примере не должно быть закрывающего замыкания. Он создает область видимости, чтобы объявленные переменные или функции не попадали в глобальную область видимости. Но когда вы не создаете переменные или именованные функции, тогда нечего просачиваться. Так что нет особого смысла.

Реальная причина может быть проще, чем вы думаете. Как и использование сигнала поворота, даже если рядом никого нет, заключать в себе все исходные файлы JS в самовыполняющуюся функцию - хорошая привычка. Это спасает вас от глупых ошибок. Так что это может быть просто примером стиля защитного программирования.

В этом примере нет пользы, но связанные с этим затраты производительности во время выполнения совершенно незначительны. Так почему бы не сделать это «правильным» способом, если кто-то из новичков входит в систему и «поддерживает» этот модуль каким-то странным образом?

0 голосов
/ 26 июля 2016

Совершенно бессмысленно делать это, потому что у вас уже есть функция, которая создает свои собственные пространства имен.

Кроме того, есть один недостаток - вы получаете дополнительный отступ, поэтому ваш код становится менее читабельным.

...