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

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20295.html

(0)
上一篇 2021年7月19日 23:19
下一篇 2021年7月19日 23:19

相关推荐

发表回复

登录后才能评论