《js高级程序设计》(第三版)7.2.1中的闭包案例:
以下是对代码的解释
可是实际运行时的结果是这样的:
即便是这样:
运行的结果还是与书中所说的结果[10,10,10,10,10,10,10,10,10,10]不同。
接下来是是书中的改进代码:
书中给出的运行结果应该是:[0,1,2,3,4,5,6,7,8,9],而这段代码的实际运行结果是:
求解
《js高级程序设计》(第三版)7.2.1中的闭包案例:
以下是对代码的解释
可是实际运行时的结果是这样的:
即便是这样:
运行的结果还是与书中所说的结果[10,10,10,10,10,10,10,10,10,10]不同。
接下来是是书中的改进代码:
书中给出的运行结果应该是:[0,1,2,3,4,5,6,7,8,9],而这段代码的实际运行结果是:
求解
这个图的result[i]接受的是函数的返回值,这里匿名函数自执行了,i为循环过程中的值,结果显然如题主那样了。
题主应该把原书的代码中,返回的函数数组,在循环后通过遍历一次执行数组中每个函数,这样返回的i就全是10了。
同样,最后的例子返回的函数数组,原书的意思也是遍历结果数组后,数组中每个函数返回的i值是[0,1,2,3,4,5,6,7,8,9]
function foo() {
var result = [];
for(let i=0;i<10;i++) {
result[i] = function(num) {
return num
}(i)
}
return result
}
Function.prototype.bind = function (scope) {
var fn = this;
return function () {
return fn.apply(scope);
};
}
函数返回函数
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
题主,你需要一颗清醒的头脑,弄清楚每次
Foo()
之后return
的是什么。第一张console图,返回了
result
,result
是一个数组,存放了10个闭包。第二张console图,返回了
result
,result
是一个数组,存放了10个自运行函数,自运行函数是什么?其实就是函数运行的返回值,也就是i
。第三张console图,依旧返回了
result
,result
依旧是一个数组,依旧存放了10个自运行函数,但这10个自运行函数的返回值却是10个闭包。至于什么时候是[1,2,3..],什么时候是[10,10,10..],要看
i
保存的时间。如果i
产生于外部函数Foo
执行期间,并在这期间调用闭包将产生的值存放于result
中,那么结果就是[1,2,3..]。如果Foo
运行结束了,这时候i的值变成10了,再调用闭包保存i
的值,这时候结果自然是[10,10,10..]了。