1

重複の可能性:
JavaScript で定義する前に関数を使用できるのはなぜですか?

予想どおり、次のコードFooは が定義されていないため、エラーをスローします。

window.Foo = Foo;

また、予想どおり、これは同じエラーをスローします。

window.Foo = Foo;
Foo = function() {
    ...
};

不思議なことに、これは問題なく動作します:

window.Foo = Foo;
function Foo(){
    ...
};

これはどのように可能ですか?JavaScript は行ごとに解釈されませんか?

4

2 に答える 2

4

巻き上げは、ここでの話の一部にすぎません。

まず、巻き上げについて説明します。

varJavaScript プログラムで使用する場合は、変数を宣言します。その変数が JS スコープで宣言されている場合はいつでも、その変数はそのスコープの先頭に引き上げられます。JavaScript には Global または Function スコープしかありません。関数の場合

function hoistAway() {
  console.log(a);
  var a = 5;
}

と同等です

function hoistAway() {
  var a;
  console.log(a);
  a = 5;
}

ご覧のとおり、宣言は引き上げられていますが、初期化はされていません。したがって、このコードはundefined5 ではなくコンソールにログオンしaます。

を使用しない場合var、宣言は明示的ではないため、巻き上げられません。したがって:

function hoistAway() {
  console.log(a);
  a = 5;
}

エラーメッセージが表示されます。

あなたの例では:

window.Foo = Foo;

Foo宣言されていないため、エラーが発生します。

window.Foo = Foo;
Foo = function() {
    ...
};

繰り返しますが、Foo は宣言されていないため、巻き上げはありません。記録のために:

window.Foo = Foo;
var Foo = function() {
    ...
};

エラーをスローしません。ただ、宣言だけは掲げているので、こんなことをしたら

var bob = {};
bob.Foo = Foo;
var Foo = function() {
    ...
};

それならbob.Fooそうでしょうundefined。グローバル スコープではとが同じであるため、の特殊なケースwindow.Foo = Fooは奇妙です。Foowindow.Foo

ついに:

window.Foo = Foo;
function Foo(){
    ...
};

関数宣言(関数式とは対照的に)も巻き上げられるため、機能します。名前と定義の両方が引き上げられるため、これは意図したとおりに機能します。

于 2012-07-16T17:58:38.910 に答える
0

スクリプトは最初に解析され、コードは後で定義される関数を呼び出すことができます。

于 2012-07-16T17:38:34.170 に答える