1
var currentScope = 0;
(function(){
    var currentScope = 1, one= 'scope1';
    alert(currentScope);
  (function(){
    var currentScope = 2, two= 'scope2';
    alert(currentScope);
    alert(one + two);
  })();
})();

jsbinでこのコードを実行すると、アラートが次のように表示され1 then 2ますscope 1 and scope 2ExecutionContextしかし、で、実際には最初に内部関数を呼び出して、それ以降を検索することを知りouter variableました。

  1. ExecutionContext Object誰かが私の関数環境でどのように見えるか教えてもらえますか?
  2. 私が間違っている場合は訂正してください。ブラウザでは、最初にcurrentScope 1が表示され、次にCurrentScope 2が表示されます。しかし、実際にはインタプリタの舞台裏で、その逆が発生します。
4

1 に答える 1

2

あなたのケースのコードは、正しい順序で値を警告しています。関数宣言をスタックの一番上に持ち上げて、実際にコードに表示される前でも呼び出しが可能になることについて、あなたは混乱していると思います。しかし、あなたの場合、それらは匿名の即時実行関数式であり、関数宣言ではありません。関数式はその場で評価され (他の関数コードと同様に解釈されます)、事前にホイストまたは利用可能になることはありません。したがって、コードに表示される順序で実行されます。

次の例がそれをある程度明確にすることを願っています。

foo(); // foo is callable since its declaration was hoisted
function foo() { // this declaration is "hoisted" to the top of the execution
   ...
}

foo(); // this will cause error
var foo = function() { .. }; // function expression, no hoisting

var x = 5;
(function() { // function expression, no hoisting
    // will alert 5, since it was interpreted in-place
    // and executed after the "var x = 5" statement
    alert(x); 
})();

次のページはそれを明確にします。

于 2012-12-29T02:48:52.083 に答える