闭合可见什么

时间:2015-04-05 11:18:52

标签: javascript scope closures

我正在阅读书籍#34; Java Script Ninja"关于封闭和范围的章节。

有代码示例:

var innerHolder;
function outerFunction() {
    console.log("outerFunction: "+x);

    function innerFunction() {
        console.log("innerFunction: "+x);
    }
    innerHolder = innerFunction;
}


console.log("outerScope "+x);
var x = 15
outerFunction();
innerHolder();

结果是:

  

outerScope undefined

     

outerFunction:15

     

innerFunction:15

然后这本书说:

  
      
  1. 外部作用域中的所有变量,甚至是在之后声明的变量   功能声明,包括在内。

  2.   
  3. 在同一范围内,尚未定义的变量不能   前向引用。

  4.   

我理解第二点,但第一点对我来说并不完全清楚。看起来这是真的,但只有在进行函数调用之前实际声明了变量。在我的逻辑中,因为如果在调用内部函数之后声明变量,变量不会被提升,那么它在当时不在外部范围内,因此它不会被闭包选中。这是对的吗?

即。如果我修改代码:

console.log("outerScope "+x);
outerFunction();
innerHolder();
var x = 15

结果将是:

  

outerScope undefined

     

outerFunction:undefined

     

innerFunction:undefined

1 个答案:

答案 0 :(得分:1)

首先,所有函数声明都将由Javascript处理。然后一切都将从左到右处理。

function sayHi(){console.log(x)}; sayHi(); var x = 1; // undefined
function sayHi(){z()}; sayHi(); function z() {console.log(2)}; var x = 1; // 2

所以你是对的。他希望向您展示的是lexical scope查看所包含链接的本质,您将比从该书中包含的示例更好地理解它。

这是在您的示例中执行所有内容的顺序:

   var innerHolder;// 2 (innerHolder = undefined)
   function outerFunction() { // 1
        console.log("outerFunction: "+x) // 6;

        function innerFunction() { // 7
            console.log("innerFunction: "+x) // 10;
        }
        innerHolder = innerFunction; // 8
    }


    console.log("outerScope "+x); // 3
    var x = 15 // 4
    outerFunction(); //5
    innerHolder(); // 9