2

david sharifが JS クイズを作成しました。

var foo=1;    

function bar(){
  return foo;
  foo=10;
  function foo(){}
  var foo =5;
}

typeof bar();//?

私の理解では、関数が最初にホストされ、次に内部で変数が宣言されます。関数のホスト形式は次のようになります (間違っている場合は修正してください)-

var foo=1; 

function bar(){
  function foo(){}
  var foo;

  return foo;
  foo=10;
  foo =5;
}
typeof bar();//?

typeof bar() 関数が未定義ではないのはなぜですか?

これは、関数の実行時に、最初の foo (関数である) を見つけて、検索を続行せずに幸せに戻るためです。または、他の何か?

あなたの時間を大切にしてください。

4

3 に答える 3

1

David Shariffブログで答えを見つけました。

「恥知らずに彼のブログからコピペ」-

foo は 2 回宣言されていますが、変数の前にアクティベーション オブジェクトで関数が作成されることは作成段階からわかっています。プロパティ名がアクティベーション オブジェクトに既に存在する場合は、単に宣言をバイパスします。

したがって、関数 foo() への参照は最初にアクティブ化オブジェクトで作成され、インタープリターが var foo に到達すると、既にプロパティ名 foo が存在することがわかるため、コードは何もせずに続行します。

これがギリシャ語のように聞こえる場合は、ブログ全体を読んでください

于 2013-12-01T03:00:21.677 に答える
0

関数宣言は、var ステートメントを「隠します」。

これをコンソールに貼り付けます。

var foo = function(){}
var foo
typeof foo

これは、コンパイル後のコードがインタープリターに「どのように見えるか」です。

var bar = function bar(){
  var foo = function foo(){}
  foo
  return foo;
  // never reached
  foo = 10;
  foo = 5;
}
var foo;
foo = 1    
typeof bar();//"function"
于 2016-02-07T12:53:24.650 に答える