javascript 模仿块级作用域

javascript没有块级作用域

首先要明确一个问题,javascript没有块级作用域,并且有变量提升,具体参考这篇

立刻执行函数

有个经典的问题

function returnFunArr(){
    var arr=[];
    for(var i=0;i<10;i++){
        arr[i]=function(){
            console.log(i);
        }
    }
    return arr;
}
for(var f of returnFunArr()){
    f();
}

结果并不是我们预期的每个元素相应输出值,而是都输出10,这是因为闭包作用域链的问题,有一种解决方案是,让函数立刻执行,如下

function returnFunArr(){
    var arr=[];
    for(var i=0;i<10;i++){
        arr[i]=function(num){
            return function(){
                console.log(num);//这里多加了括号,立刻执行
            }
        }(i)
    }
    return arr;
}
for(var f of returnFunArr()){
    f();
}

其实这个很好理解,比如

function f(){
}
f();//f立刻执行

因为f就是一个值,所以我们想将f替换为函数,所以写成

function (){
    console.log("execute...");
}();

但是这样写执行错误,因为js引擎认为function是个函数的关键字,函数后边不能跟(),但是表达式后边可以跟(),所以可以将function用()包起来,当作表达式

(function (){
    console.log("execute...");
})();

这就是立刻执行函数,英文专业名词叫immediately invoked function expression

等等,我们的题目是模仿块级作用域,为啥提立刻执行函数?
这是因为js中没有块级作用域,只有函数作用域,为了隔离只能将变量放在函数中,而为了这个函数能执行并且简单,那最好的情况就是这个函数能自动执行,所以就有了立刻执行函数…….

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值