RequireJSモジュール定義の周りに、追加の即時的に投げかけられた関数を包む正当な理由はありますか?
-
26-10-2019 - |
質問
GitHubのBackbone-Requirejsボイラープレートを見ていましたが、2種類の実装が見られます。
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モジュール全体に自己実行機能があるのですか?
解決
この例では、閉鎖を含める必要はありません。宣言された変数や関数がグローバルな範囲に漏れないようにスコープを作成します。しかし、変数や名前付き関数を作成していない場合、漏れることは何もありません。だから、それほど意味はありません。
本当の理由は、あなたが思っているよりも簡単かもしれません。ターン信号を使用しても、誰もいない場合でも、すべてのJSソースファイルを自己実行機能に囲むことは、入るのに良い習慣です。それはあなたを愚かな間違いから救います。したがって、それはただの防御プログラミングスタイルの例かもしれません。
この例では利点はありませんが、実行時に関連するパフォーマンスコストはまったく無視できます。それでは、新しいモジュールがいくつかのファンキーな方法でこのモジュールが入って「維持」された場合に備えて、「正しい」方法でそれをしてみませんか?
他のヒント
これを行うことにはまったく意味がありません。なぜなら、あなたはすでに独自の名前空間を作成する関数を持っているからです。
さらに、不利な点があります - あなたは余分なインデントを取得しているので、あなたのコードが読みやすくなります。