2

Javascriptコード

var d = function c() { console.log(c); };
d(); // function c() { console.log(c); }; 
c(); // Reference Error

変数宣言と関数定義が既存のスコープの一番上に持ち上げられる変数巻き上げの概念を理解しています。また、関数式の関数定義は引き上げられません。

だから、上記は

var d;
d = function c() { console.log(c); };
d();
c();

したがって、dは名前付き関数cへの参照です。

  1. 関数cの実行d()時に、cという名前の変数またはプロパティがないグローバルスコープで実行されます。しかし、それでもコンソールはcの関数定義をログに記録することができます。
  2. 試しc()たところ、参照エラーが発生しました。[私の期待通りに]

ケース2は、cという名前のウィンドウプロパティが利用できないことを証明しています。では、d()実行時にcの定義をどのように出力できたのでしょうか。

すべての関数は、ローカルスコープにプロパティとして独自の定義を持っていますか?

4

1 に答える 1

1

はい。名前付き関数式は、その関数のスコープ内でのみ関数名に対応する変数を生成します。

これは、このテーマに関する優れた、しかし長い記事です:http: //kangax.github.com/nfe/

ECMAScript5仕様の関連セクションも参照してください。これについては特別な注意があります。

于 2012-05-07T14:59:13.330 に答える