JS新手问个关于闭包和函数作用域链的问题~谢谢
function makefunc(x) {return function () { return x; }
}
var a = [makefunc( 0 ), makefunc( 1 ), makefunc( 2 )];
alert(a[ 0 ]()); // Displays 0
alert(a[ 1 ]()); // Displays 1
alert(a[ 2 ]()); // Displays 2
请问下为什么当makefunc( 0 ), makefunc( 1 ), makefunc( 2 ) 分别被调用的时候,他们生成的调用对象/活动对象(call object) 都是不同的呢? (3个调用对象,即每调用makefunc()生成一个调用对象)
即:为什么不是这么一种情况:makefunc( 0 ), makefunc( 1 ), makefunc( 2 )分别被调用时,生成的是同一个调用对象,而这个调用对象里的X属性,每次调用的时的值都不一样,分别是0,1,2
(我的意思是,为什么当makefunc() 被调用三次,会生成三个不同的调用对象(被调用时实际参 数不一样)。这三个不同的调用对象里X的属性的值分别是0,1,2. 然后0,1,2 分别被a[ 0 ](),a[ 1 ](),a[ 2 ]()读取到。因为a[ 0 ](),a[ 1 ](),a[ 2 ]()的调用对象里没有属性x 的定义,所以从上层作用域里去读取。
我想不通的是为什么不是这种情况,即:makefunc( 0 ), makefunc( 1 ), makefunc( 2 )分别被调用时,生成的是同一个调用对象,当a[ 0 ](),a[ 1 ](),a[ 2 ]()到这个调用对象里来读X 的值时,x 的值都不一样(分别是0,1,2)。就像给一个变量赋了3个值一样。然后再被a[ 0 ](),a[ 1 ](),a[ 2 ]()读取到。不知道我说清楚了没有。。。)