//ES5中的作用域
var callbacks=[];
for(var i=0;i<=2;i++){
callbacks[i]=function(){
return i*2;//闭包,函数里面是一个表达式,而不是一个值,i为全局,到最后i为3的时候才执行
}
}
console.table([
callbacks[0]();//6
callbacks[1]();//6
callbacks[2]();//6
])
// 如果用 let 声明 i,有一个块作用域,这个时候的闭包取决于当前的块作用域,每循环一次就生成一个新的作用域,这个闭包就导向闭包作用域里面的变量。
//在ES6中只要使用{}就能指定一个块作用域
{
function foo(){
return 1;
}
console.log("foo()==1",foo()==1);//true;
{
function foo(){
return 2;
}
console.log("foo()==2",foo()==2);//true;
}
console.log("foo()==1",foo()==1);//true;
}
//在ES5中 立即执行函数((function(){
const foo=function(){
return 1;
}
console.log("foo()==1",foo()==1);//true;
((function(){
const foo=function(){
return 2;
}
console.log("foo()==2",foo()==2);//true;
})())
})())