标签:
这2处的代码是高级程序第三版的代码。个人觉得高三解释的不是很深入没有解释清楚。所以我按照ECMA从新解释了下。
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(num){//创建函数时创建包含所有父执行环境的变量对象作用域链,第一次进入函数的执行环境,活动对象里的num属性值为0;第二次进入函数的执行环境,每次进入的函数的执行环境都是一个新的执行环境。很明显两次的执行环境是不同的。所以,此时活动里的num属性值为1;
return function(){//创建函数时创建包含所有父执行环境的变量对象作用域链,此时的num为0;当进入 result[0]()函数的执行环境时他的作用域链的第二个活动对象是父函数执行环境的活动对象 值为0;当进入 result[1]()第二次进入函数的新执行环境时,作用域链的第二个活动对象是父函数执行环境的活动对象,注意:此时的父函数的执行环境是一个新的执行环境,所以它的作用域链的第二个活动对象指针指向新的父函数执行环境的活动对象;还有一点当return函数退出时,父执行环境被销毁,但是活动对象依然保存在内存中;每个被保存到result数组里面的函数的执行环境的作用域链的第二个活动对象指针引用的都是一个新的父执行环境的活动对象;所以num值为1;
return num;
};
}(i);//当循环体执行完毕后。result[i]里面的每个函数对象都是不相等的。
}
return result;
}
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){//创建函数时创建包含所有父执行环境的变量对象作用域链,
return i;
};
}
return result;//result[i]里面的每个函数对象都是不相等的。当循环体结束后createFunctions函数的执行环境的活动对象的属性i=10;父函数执行环境只被进入一次。 result[i]()每次进入函数执行环境都是一个新的执行环境。此时的执行环境的作用域链的第二个活动对象指针是指向 同一个函数父执行环境的活动对象,所以i的值是10;
}
以上观点全是个人见解。不喜忽看;
标签:
原文地址:http://www.cnblogs.com/cmptlgg/p/4632546.html