10

以下のコードは JavaScript コードです。JavaScript の関数スコープを理解しようとしており、こちらの記事に従っています。以下のコードを再現しています -

var cow = "purple"; // just a random cow

var f = function (x) {
    var r = 0;
    cow = "glue";
    if (x > 3) {
        var cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

文字列「紫」が警告される理由がよくわかりません。行cow = "glue";は、牛変数の値を「glue」に設定する必要があります。if ブロックを削除して、最後のステートメントで alert cow を実行すると、文字列 "glue" が警告されることがわかります。

f(2) が呼び出されると、if コード ブロックが入力されず、その中の何も実行されないのに、異なる結果が表示されるのはなぜですか? つまり、最後のステートメントで alerting cow が文字列 "purple" を返すのはなぜですか?

4

4 に答える 4

9

関数内の変数宣言は、常に先頭に持ち上げられます。したがって、実際のコードは次のとおりです。

var f = function (x) {
    var cow, r;
    r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

関数内では、グローバルではなく、常にlocalに割り当てます。 cow

于 2013-06-12T19:08:26.397 に答える
5

ここで理解しておくべき 2 つのことは、Javascript 変数はそのスコープの一番上に引き上げられることと、JavaScript にはブロック スコープがないことです。

そう

  1. スコープ内のすべての変数は、スコープの先頭で宣言されていると見なされます
  2. if ステートメントは新しいスコープを作成しません。

したがって、あなたの例は次と同等です

var cow = "purple"; // just a random cow

var f = function (x) {
    var cow, r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

if 文の var 宣言を一番上に上げています。その時点で、関数内のすべての牛の参照は、外側のスコープからの牛ではなく、ローカル変数の牛を参照します。

于 2013-06-12T19:09:04.230 に答える
4

あなたは本当にその記事を読んでいませんね?明示的に述べている

あなたが呼び出すときはcow変わりますか?いいえ、 if ブロック内宣言が関数全体に適用されるため、上記のコードでは安全です。これは、それが関数全体のローカル変数であることを意味します。"glue"f(2)cowvar cowcow

ただし、if ブロックを削除すると、その中の変数宣言も削除され、代入はグローバル変数をターゲットにします。

于 2013-06-12T19:19:52.267 に答える
4

Javascript にはブロック スコープがありません (ブロック内を除くcatch)。
すべてのvarステートメントは、含まれている関数の先頭に持ち上げられます。

したがって、決して実行されないcow場合でも、関数内の任意の場所でローカル変数を参照します。if

于 2013-06-12T19:08:15.170 に答える