函数作用域和块级作用域 --《你不知道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,同样可以用来创建块作用域变量,但其值是固定的(常量)。之后任何试图修改值的操作都会引起错误