《js高级程序设计》(第三版)7.2.1中的闭包案例:
以下是对代码的解释
可是实际运行时的结果是这样的:
即便是这样:
运行的结果还是与书中所说的结果[10,10,10,10,10,10,10,10,10,10]不同。
接下来是是书中的改进代码:
书中给出的运行结果应该是:[0,1,2,3,4,5,6,7,8,9],而这段代码的实际运行结果是:
求解
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
题主,你需要一颗清醒的头脑,弄清楚每次
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..]了。返回函数数组 数组里面都是函数,要得到i的值还需要result[i]()这样运行一次
函数返回函数
Foo()[9]();
就能看到书中的意图了
我觉得对闭包最好的解释是:闭包中对外部变量的使用都是通过引用传递,而不是通过值传递。