javascript 模仿块级作用域

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangjun5159/article/details/80644792

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中没有块级作用域,只有函数作用域,为了隔离只能将变量放在函数中,而为了这个函数能执行并且简单,那最好的情况就是这个函数能自动执行,所以就有了立刻执行函数…….

展开阅读全文

没有更多推荐了,返回首页