1

私は学習目的でさまざまなJavaScriptライブラリを調べていました。基本的に、名前空間を初期化する最良の方法を見つけて、プロがライブラリ内の関連するすべてのファイルをどのようにロードするかを確認したいと思います。これは、ライブラリユーザーがいくつかのライブラリで呼び出すメインファイル(たとえば、myNameSpace.jsと呼びます)で数回遭遇しました。

(function() {

    var jsFiles = window.MyNameSpace;

    window.MyNameSpace = {
        _getScriptLocation: (function() { 
            /* some code here */ 
        })
    };

    if(!jsFiles) { 
        jsFiles = [/* An array of ALL the library files! */];
    }

    for(var i=0, len = jsFiles.length; i<len; i++) { 
        scriptTags[i] = "<script src='" + jsFiles[i]  + "'></script>"; 
    }

    if(scriptTags.length > 0) { 
        document.write(scriptTags.join("")); 
    }

})();

したがって、この設定では、ライブラリユーザーがライブラリの特定の部分のみを含める場合は、myNameSpace.jsをロードする前に、次の行に沿って何かを実行して指定します。

<script type='text/javascript'> window.MyNameSpace = ["libraryFile1.js", "libraryFile2.js", "libraryFile3.js"]</script>
<script type='text/javascript' src="MyNameSpace.js"></script>

私の質問は、window.MyNameSpaceはオブジェクトであり、スクリプトがjsFilesをwindow.MyNameSpaceとして配列設定に割り当てる場合、これは参照による割り当てになりますよね?しかし、その行の直後に、window.MyNameSpaceが完全に変更されます。では、jsFilesは渡された元の配列を参照しないようにする必要がありますか?私の理解では、ここで何が欠けていますか?

4

1 に答える 1

3

JSは「参照による」割り当てではなく、割り当てはコピーですが、オブジェクトを割り当てるときは、オブジェクト「自分自身」ではなく、それらのアドレスをコピーします。

見て

window.MyNameSpace = ["libraryFile1.js", "libraryFile2.js", "libraryFile3.js"]

window.MyNameSpaceメモリ内のオブジェクトを指します。そのアドレスが0x12345であると仮定しましょう

var jsFiles = window.MyNameSpace;

jsFiles同じオブジェクトを指すようになりました(0x12345)

window.MyNameSpace = {...}

window.MyNameSpaceここで、他のオブジェクト(0x56789とします)をjsFiles指しますが、それでも最初のオブジェクト(0x12345)を指します。

于 2012-10-17T16:44:07.883 に答える