0

core.js があるとします

var ajax = function(){};
var something = function(){super};
var globalconstant = 5;
var someutilitymodule = {
onekey: something;
twokey: something;
}

これをファイルに含めると<script src="core.js">

1) グローバル名前空間を汚染します

2) 別の変数を [置き換える/置き換える] 可能性があります。

しかし、オブジェクトにすれば問題は解決しませんか? つまり、このようにcore.jsを作成します

core = 
{
    ajax : function(){},
    something : function(){super},
    globalconstant : 5,
    someutilitymodule = {
                        onekey: something;
                        twokey: something;
                        }
}

このアプローチの根本的な問題は何ですか? 完全なオブジェクトが作成されるまで、他のアイテムにアクセスできないためですか? たとえば、core = {a:"Foo" , b:a}うまくいきませんか?しかし、私はそれを解決することができました

core = {};
core.a="Foo";
core.b=core.a;

クロージャーに本当に興味がないのに、なぜ IIFE (Immediately Invoked Function Expression) に入る必要があるのでしょうか? すべてを別の名前空間で公開することを気にしないJavascriptの「モジュール名前空間」の場合、このアプローチは機能し、Javascriptでモジュール効果を作成しませんか?

これについてもっと読むための指針はありますか?私はそれが少し曖昧であることを知っていますが、IIFE requirejs などのようなこの概念は初めてです。初心者の視点から理解しようとしています。

4

1 に答える 1

0

この質問は、JavaScript - オブジェクト リテラルの利点に関連しています。

「オブジェクトリテラル表記法」は、これに対する専門用語です。http://css-tricks.com/how-do-you-structure-javascript-the-module-pattern-edition/のようなモジュール パターンはより高度な形式ですが、JavaScript でコードを分離するために一般的に使用されるパターンの 1 つです。そして、クロージャーを使用してプライベート変数などの追加機能を取得するためだけに IFFE を使用します。

ただし、すぐに関数内でメソッドを定義しない限り、IFFE 変数に後からアクセスすることはできません。後でこの IIFE 変数を使用するようにメソッドを拡張することはできません。

例えば ​​:

//counter here is the iife functions' counter variable
var module = (function(){var counter=1; return {getCounter: function(){return counter}}})()

//counter here is the global counter variable as it was created from the global scope
module.setCounter = function(arg){counter = arg + counter}
于 2014-08-29T10:18:13.660 に答える