您的当前位置:首页正文

what 函数作用域 & 块作用域 ❓

2024-12-02 来源:个人技术集锦

​​​​​​函数作用域(外部函数无法访问函数内部内容)

优点:函数作用域有效有用

缺点:函数名污染所在作用域,且希望不调用函数就能自动运行

避免缺点的方法:

块作用域

函数作用域是最常见的作用域单元,但也有其他优秀的作用域

  1. with,用width从对象中创建出的作用域仅在with声明中有效

    但!内部正常的var声明并不会被限制在块作用域中,而是添加到with的作用域中,即with会根据传递的对象凭空创建全新的词法作用域

    且!with是一种欺骗语法,出现with(或是eval)后可能所有的优化语句都是无意义的,故最简单的方法就是不做优化

  2. try/catch,catch分句会创建一个块作用域,其中的变量仅在catch中有效(且当同一个作用域中两个或多个catch分句用同样的标识符声明错误变量时,很多检测工具会警告)

  3. 显式声明创建块作用域
    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);
    }
} 

 

显示全文