javascript中的作用域链和[[Scope]]

javascript中的作用域链和[[Scope]],javascript,Javascript,现在,当我在jsbin中执行此代码时,我得到的警报是1,然后是scope 1和scope 2。但是我知道在ExecutionContext中,它实际上会首先调用内部函数,该函数将查找外部变量,然后依此类推 有人能告诉我在我的函数环境中,ExecutionContext对象是什么样子的吗 如果我错了,请更正,在浏览器中,它将首先显示currentScope 1,然后显示currentScope 2。但实际上,在解释器的幕后,情况正好相反 您案例中的代码以正确的顺序警告值。我相信您对将函数声明提升到

现在,当我在jsbin中执行此代码时,我得到的警报是
1,然后是
scope 1和scope 2
。但是我知道在
ExecutionContext
中,它实际上会首先调用内部函数,该函数将查找
外部变量
,然后依此类推

  • 有人能告诉我在我的函数环境中,
    ExecutionContext对象
    是什么样子的吗
  • 如果我错了,请更正,在浏览器中,它将首先显示currentScope 1,然后显示currentScope 2。但实际上,在解释器的幕后,情况正好相反

  • 您案例中的代码以正确的顺序警告值。我相信您对将函数声明提升到堆栈顶部感到困惑,这样即使在它们实际出现在代码中之前,调用它们也是可能的。但在您的例子中,它们是匿名的,立即执行函数表达式,而不是函数声明。函数表达式是就地求值的(与任何其他函数代码一样进行解释),并且不会被提升或提前提供,因此将按照它们在代码中出现的顺序执行

    我希望下面的例子能够在一定程度上澄清这一点

    var currentScope = 0;
    (function(){
        var currentScope = 1, one= 'scope1';
        alert(currentScope);
      (function(){
        var currentScope = 2, two= 'scope2';
        alert(currentScope);
        alert(one + two);
      })();
    })();
    
    以下几页将说明这一点:


    currentScope的变量阴影在这两种情况下都是在使用前立即设置的,因此这是一个令人费解的问题。(但不是,观察到的结果表明了它是如何工作的。如果引擎/解释器的工作方式不同,结果也会不同。)您认为内部函数首先被调用的原因是什么?它实际上是从外部函数调用的,就在警报之后。语句“它实际上会首先调用内部函数,然后再查找外部变量”和“但实际上在解释器的幕后,情况正好相反。”让我这么想。我给了+1。然而,虽然我不太清楚OP想要说什么,但我不相信吊装与这种行为有任何关系;可能是对调用函数意味着什么感到困惑。。在同一个调用站点调用一个被提升的函数也会产生同样的效果。@pst-在他的特定示例中,是的,因为他完全是在处理立即分配的局部变量。
    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); 
    })();