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