var data=[];
for(var i=0; i<3; i++){
data[i] = function(){ console.log(i); }
}
data[1]();
没有块级作用域
因为data数组中存了3个function,每个function执行时,需要用到i,但是自己的作用域内没有,
向上查找【AO,globalContext.VO】所以都为3.
但是如果改成let i......(块级作用域)
或者
包装成自执行函数 【AO,匿名函数的AO,globalContext.VO】
data[i]=(....)(i) function(i){return function(){ 打印i }}
作用域虽然pop了,但是作用域链的对象被依赖了,所以还在
闭包:红宝书P178:有权访问另外一个函数作用域中的变量的函数
var myCounter1 = createCounter(100);
var myCounter2 = createCounter(200);
function createCounter(val){
var counter = val; 闭包-存储私有变量
function increment(value){ counter += value}
function get(){ return counter; }
return {increment, get}
}
会创建2个不同的作用域scope对象:myCounter1 和 myCounter2
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
var foo = checkscope(); foo指向函数f
foo(); 调用函数f()
步骤:
1,创建全局context,压入堆栈,初始化(this、变量、原型链等)
2,创建checkscope的context,压栈,初始化。执行完毕,弹出。
3,创f,压栈,init,exec,pop
问题来了:
为什么2弹出了,3依赖2的变量还能访问到
3维持着一个作用域链数组内有2的活跃对象,即使context2弹出但js继续维持着context2
网友评论