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

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

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

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

避免缺点的方法:

  1. 匿名函数表达式(函数声明不可匿名)

    setTimeout(function(){
        console.log('test');
    },1000)

    但没有有意义的函数名,调试不便,递归是只能用arguments.callee

  2. 立即执行函数表达式

    (function foo(){//最前面的括号将函数变为函数表达式
        var a=3;
        console.log(a);
    })();//最后面的括号执行了该函数

     

块作用域

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

  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);
    }
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值