优点:函数作用域有效有用
缺点:函数名污染所在作用域,且希望不调用函数就能自动运行
避免缺点的方法:
函数作用域是最常见的作用域单元,但也有其他优秀的作用域
with,用width从对象中创建出的作用域仅在with声明中有效
但!内部正常的var声明并不会被限制在块作用域中,而是添加到with的作用域中,即with会根据传递的对象凭空创建全新的词法作用域
且!with是一种欺骗语法,出现with(或是eval)后可能所有的优化语句都是无意义的,故最简单的方法就是不做优化
try/catch,catch分句会创建一个块作用域,其中的变量仅在catch中有效(且当同一个作用域中两个或多个catch分句用同样的标识符声明错误变量时,很多检测工具会警告)
if(foo){
{
let bar=foo*2;
console.log(bar);
}
}
显式声明创建块作用域 作用一:垃圾回收
function progress(data){..}
var somedata={..};
progress(somedata);//因为后面不需要用到somedata,所以在这里用完其实就可以垃圾回收了的
//但!由于click函数形成了一个覆盖整个作用域的闭包,故JS极有可能并未垃圾回收somedata
btn.addEventListener("click",function click(event){
console.log("click");
})
function progress(data){..}
{
var somedata={..};
progress(somedata);
}
//在这里加上块作用域,引擎即可知没有必要保存somedata
btn.addEventListener("click",function click(event){
console.log("click");
})
作用二:let循环
for(let i=0;i<10;i++){
console.log(i);
}//实际上let将i绑定到了循环的每一个迭代中
故等价于
{
let j;
for(j=0;j<10;j++){
let i=j;
console.log(i);
}
}