12

Stoyan Stefanov による Object-Oriented JavaScriptを使用して Javascript を学習しています。

彼は、グローバル スコープとローカル スコープを比較する例を示しています。

var a = 123;
function f() {
    alert(a);
    var a = 1;
    alert(a);
}
f();

この例を見ると、最初のアラートが「123」で、2 番目のアラートが「1」であると予想しました。見よ、ストヤンは言う:

最初の alert() は 123 (グローバル変数 a の値) を表示し、2 番目は 1 (ローカル変数 a) を表示すると予想するかもしれません。これはそうではありません。最初のアラートは「未定義」と表示されます。これは、関数内ではローカル スコープがグローバル スコープよりも重要であるためです。したがって、ローカル変数は、同じ名前のグローバル変数を上書きします。最初の alert() の時点では、 a はまだ定義されていませんでしたが (したがって、値は定義されていません)、まだローカル空間に存在していました。

説明がわかりにくかったのですが、最初のアラートでローカル変数がグローバル変数をどのように上書きするのでしょうか? 他の/異なる説明をいただければ幸いです。

4

2 に答える 2

10

グローバル変数をオーバーライドしていません。起きていることは「可変巻き上げ」と呼ばれます。つまりvar a;、関数の先頭に a が挿入されます。

スクリプト エンジンは、スクリプトを次のように変更します。

var a = 123;
function f() {
    var a;
    alert(a);
    a = 1;
    alert(a);
}
f();

教訓: 変数を使用する前に、必ず変数を宣言してください。関数の先頭ですべての変数を宣言すると言う人もいます。

于 2012-08-13T17:06:59.053 に答える
3

簡単に言えば、変数と関数の両方のすべての宣言が最初に考慮されます。したがってvar a、実質的にローカルはローカルスコープでのみグローバル変数をオーバーライドし、値はありませんundefined。したがって、最初のアラートが表示されundefinedます。2 番目のアラートでは、 の後に 1 が表示されa = 1ます。これはローカルで発生し、グローバル変数 a の値は 123 になり、変更されません。

関数を使用してその仕組みを示す別の例

 function show(){
    alert("I am global");
 }

 function f() {

    show();

    show = function(){
       alert("I am second");
    }  

    show();   

    function show(){
        alert("I am first");
    }

}
f();
show();
于 2012-08-13T17:15:07.893 に答える