-1

JavaScript、そのスコープ、名前空間、およびグローバル変数 (およびそれらを使用しない方法) について学んでいます。

私の質問を説明する完全な例を以下に示します。JavascriptLearning という名前の名前空間を作成し、その名前空間に Customer 関数を追加します。期待どおりに動作し、JavascriptLearning オブジェクト/名前空間がグローバル オブジェクトに追加され、Customer 関数がこの名前空間に追加されます。

この後、4 つの変数を作成します。 なぜこれら 4 つの変数appNametestcust1notNewInstanceがグローバル スコープに追加されないのか、私は思っていたので混乱しています。

(Chromeでデバッグし、アラート呼び出しで実行の最後に「this」オブジェクトを表示することにより、それらがグローバル名前空間に追加されていないことを発見しました。)

<html>
<head>
    <script>
        var JavascriptLearning = window.JavascriptLearning || {};

        // Pass in the namespace
        (function(nameSpace) {
            // Uppercased because we are using this function as a "class".
            nameSpace.Customer = function Customer(name, company) {
                // Using this, we create a new object and add properties to it.  Puts an object dynamically with a "shape"
                this.name = name;
                this.company = company;

                // Without a return keyword, the return value would be undefined
                return 0;
            }
        })(JavascriptLearning);
        var appName = "Hello";
        var test = function TEST() { return; }

        // Assigning the new keyword is used to return an object as defined in the function.
        var cust1 = new JavascriptLearning.Customer("Matt", "Company");

        // Not using the new keyword simply uses the return value of the function
        var notNewInstance = JavascriptLearning.Customer("Test", "Company");
        this.alert(cust1.name + " " + cust1.company);
    </script>
</head>
    <body>

    </body>
</html>
4

3 に答える 3

1

JavaScriptでグローバル変数を設定すると、ウィンドウオブジェクトに自動的に追加されます。Chromeは、「this」をウィンドウオブジェクトとして参照している可能性があります。

http://snook.ca/archives/javascript/global_variable/

于 2012-09-17T21:51:58.593 に答える
0

グローバル名前空間にこれらの変数が表示されます。あなたは間違っているかもしれませんか?

変数を宣言するときは、現在の関数の先頭で宣言する必要があります。これは解釈時に自動的に発生し、可変巻き上げと呼ばれます

これは、たとえば、宣言したクロージャーにアラートを追加すると実証できます。

(function(nameSpace) {
  nameSpace.Customer = function Customer(name, company) {
    this.name = name;
    this.company = company;
    alert(appName);

    return 0;
  }
})(JavascriptLearning);

コードを手続き的に読むと、それは未定義であると予想されますが、何が起こっているのかというと、

var JavascriptLearning = window.JavascriptLearning || {};
var var appName, test, cust1, notNewInstance;

次に、クロージャーは、関数の残りの有効期間のすべての変数への参照を取得します。

于 2012-09-17T22:10:18.727 に答える
0

JavaScript には適切な名前空間がありません。この用語namespaceが JavaScript で使用されている場合、変数参照に割り当てられたスコープを参照するために誤って使用されている可能性があります。現時点では、JavaScript には関数スコープしかありませんが、近い将来にはブロック スコープも持つ予定です。

オブジェクト リテラルまたは関数に単一のグローバル変数を割り当てることで、グローバル スコープの汚染を回避できます。オブジェクト リテラルのすぐ内側にあるものはすべてプロパティになり、関数内のものはすべて var キーワードを使用してスコープする必要があります。最上位関数では、"use strict";プラグマを使用して、宣言されていない参照をチェックします。そうしないと、暗黙の (偶発的な) グローバルになります。

于 2012-09-17T21:57:42.223 に答える