js高程中闭包讲解的问题?

发布于 2022-09-02 12:06:51 字数 953 浏览 14 评论 0

《js高级程序设计》(第三版)7.2.1中的闭包案例:
图片描述

以下是对代码的解释
图片描述

可是实际运行时的结果是这样的:
图片描述

即便是这样:
图片描述

运行的结果还是与书中所说的结果[10,10,10,10,10,10,10,10,10,10]不同。


接下来是是书中的改进代码:
图片描述

书中给出的运行结果应该是:[0,1,2,3,4,5,6,7,8,9],而这段代码的实际运行结果是:
图片描述

求解

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

堇色安年 2022-09-09 12:06:52

题主,你需要一颗清醒的头脑,弄清楚每次Foo()之后return的是什么。

第一张console图,返回了resultresult是一个数组,存放了10个闭包。
第二张console图,返回了resultresult是一个数组,存放了10个自运行函数,自运行函数是什么?其实就是函数运行的返回值,也就是i
第三张console图,依旧返回了resultresult依旧是一个数组,依旧存放了10个自运行函数,但这10个自运行函数的返回值却是10个闭包。

至于什么时候是[1,2,3..],什么时候是[10,10,10..],要看i保存的时间。如果i产生于外部函数Foo执行期间,并在这期间调用闭包将产生的值存放于result中,那么结果就是[1,2,3..]。如果Foo运行结束了,这时候i的值变成10了,再调用闭包保存i的值,这时候结果自然是[10,10,10..]了。

萌吟 2022-09-09 12:06:52

返回函数数组 数组里面都是函数,要得到i的值还需要result[i]()这样运行一次

咆哮 2022-09-09 12:06:52

clipboard.png
这个图的result[i]接受的是函数的返回值,这里匿名函数自执行了,i为循环过程中的值,结果显然如题主那样了。
题主应该把原书的代码中,返回的函数数组,在循环后通过遍历一次执行数组中每个函数,这样返回的i就全是10了。

同样,最后的例子返回的函数数组,原书的意思也是遍历结果数组后,数组中每个函数返回的i值是[0,1,2,3,4,5,6,7,8,9]

久夏青 2022-09-09 12:06:52

clipboard.png

function foo() {
    var result = []; 
    for(let i=0;i<10;i++) { 
        result[i] = function(num) {
        return num
        }(i) 
    }  
    return result
}
画骨成沙 2022-09-09 12:06:52
Function.prototype.bind = function (scope) {
    var fn = this;
    return function () {
        return fn.apply(scope);
    };
}

函数返回函数

南七夏 2022-09-09 12:06:52

Foo()[9]();
就能看到书中的意图了

迷你仙 2022-09-09 12:06:52

我觉得对闭包最好的解释是:闭包中对外部变量的使用都是通过引用传递,而不是通过值传递。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文