函数作用域和块级作用域 --《你不知道JS》

1.函数作用域

  1.函数作用域的含义是指,属于这个函数的全部变量都可以在整个函数的范围内使用及复用(事实上在嵌套的作用域中也可以使用) 。

  2.避免函数变量冲突,隐藏”作用域中的变量和函数所带来的另一个好处,是可以避免同名标识符之间的冲突; 

  3.可通过立即执行函数和匿名函数等解决变量冲突问题;

2.块作用域

  在表面上看JavaScript没有块级作用域,但深入研究有些可以看作是块级作用域。

  1.with()

    用with从对象中创建出的作用域仅在with声明中而非外部作用域中有效 .

  2.try/catch

    ECMA3规范中规定try/catch的catch分句会创建一个块级作用域,其声明的变量仅在catch分句中有效;

try {
    undefined(); // 执行一个非法操作来强制制造一个异常
}
catch (err) {
    console.log( err ); // 能够正常执行!
} 
console.log( err ); // ReferenceError: err not found

3.let

  ECMA6引入了let,提供除了var以外的另一种变量声明方式。let关键字可以将变量绑定到所在的任意作用域中(通常是{ .. }内部)。换句话说,let可以声明块级变量。 在for 循环中应用广泛

    var foo = true;
    if (foo) {
    et bar = foo * 2;
    bar = something( bar );
    console.log( bar );
} 
    console.log( bar ); // ReferenceError    

  注意:但是使用let进行的声明不会在块作用域中进行提升。声明的代码被运行之前,声明并不“存在”。

{
    console.log( bar ); // ReferenceError!
    let bar = 2;
}

 

  其非常有用的原因和垃圾回收机制有关,引擎可以清楚地知道要不要回收变量。

4.const

  ES6还引入了const,同样可以用来创建块作用域变量,但其值是固定的(常量)。之后任何试图修改值的操作都会引起错误 

 

posted @ 2017-10-19 20:33  im.lhc  阅读(517)  评论(0)    收藏  举报