js中闭包面试题,有关变量值会被保存的问题(求助各位大佬)

发布于 2022-09-12 04:42:18 字数 669 浏览 19 评论 0

我刚刚学到js闭包,碰到一道有关于闭包的题。

    function fun(n, o) {
        console.log(o)
        return {
            fun: function (m) {
                // console.log(n)
                return fun(m, n)
            }
        }
    }
    var a = fun(0); //und
    a.fun(1); //0    
    a.fun(2); //0    
    a.fun(3); //0    

这里的值为什么不会累加呢,每次都是从0开始呢?下面这道题也是再一次的调用,没有值接收,却是可以累加

 function fn() {
        var a = 0;
        function fn1() {
             a++;
            console.log(a) //123
            return fn(a)
        }
        return fn1;

    }
    var f = fn();
    f() //1
    f() //2
    f() //3

麻烦诸位大佬了,还望指点迷津,谢谢

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

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

发布评论

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

评论(1

清风挽心 2022-09-19 04:42:18

首先 出这道题的人 脑子有坑————这道题本身确实涉及闭包了,但是面试者有故意绕晕人的嫌疑,实在太low。并且谁在业务中写这样的代码,我见到一定踢他的屁股。

第一个函数,为什么没有加起来,注意a对象仅仅被赋值了一次,并且包住了第一次传入fun函数的n值,也就是0。
之后的每一次a.fun() 都是再调用 fun(x, 0) (x = 1, 2, 3), 打印o值,o都是0。

第二个很好理解,就是很典型的闭包例子,不用多解释吧。。。

尝试把第一个改成下面的代码试试,注意后三句:

    function fun(n, o) {
        console.log(o)
        return {
            fun: function (m) {
                // console.log(n)
                return fun(m, n)
            }
        }
    }
    
    var a = fun(0); // 输出undefined,返回值里记住了0
    a = a.fun(1); // 输出上次记住的0,返回值里记住了1
    a = a.fun(2); // 输出1,返回值里记住了2
    a = a.fun(3); // 输出2,返回值里记住了3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文