美文网首页
JS闭包例题讨论

JS闭包例题讨论

作者: foolgry | 来源:发表于2016-11-19 17:37 被阅读0次

上一篇文章谈论了闭包的概念和一些应用,并给出一个例题,这篇文章就此道例题进行讨论。

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

问:三行a,b,c的输出分别是什么?

首先来看第一行

  • var a = fun(0);
    等同于fun(0, undefined),因为未传递第二参数,所以打印undefined
  • a.fun(1);
    因为闭包的存在,所以n依然在内存中存在,所以此式等同于fun(0, undefined).fun(1)
    所以a.fun(1)返回的就是fun(m, n)
    m是传进去的参数1,n是内存中依然存在的0,所以实际返回的是fun(1, 0);因此打印的值为0,;
    后面两步就同理了;
    注意:这一步弄明白,这道题基本就明白了。所以一定要注意。第一行的后面两步就换了一下参数。第二行就相当于一直迭代,第三行就是稍加变化,重点在这一步。
  • a.fun(2);
    返回fun(2, 0),依然打印0
  • a.fun(3);
    返回fun(3, 0),依然打印0
  • 所以第二行打印值为undefined,0,0,0

第二行

  • var b = fun(0)
    从这来看,和第一行暂时一样,打印undefined
  • .fun(1)
    此时和第一行第二步也是一样,返回fun(1, 0), 打印0
  • .fun(2)
    这一步其实已经变为fun(1, 0).fun(2),弄明白了上面,你一定知道这一步应该返回的是fun(2, 1);因为此时在内存中的n是1;所以打印值为1;
  • .fun(3)
    和上一步道理相同,n变为2,即fun(3, 2);打印2
  • 所以第二行打印值为undefined,0,1,2

第三行就是一二行的结合,如果弄懂了上面两行,第三行不过是一个验证的过程。也就不在多说。
输出为 undefined,0,1,1

相关文章

  • JS闭包例题讨论

    上一篇文章谈论了闭包的概念和一些应用,并给出一个例题,这篇文章就此道例题进行讨论。 问:三行a,b,c的输出分别是...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS闭包

    JS闭包 闭包练习

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • 简单的聊一下闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • 浅谈闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

网友评论

      本文标题:JS闭包例题讨论

      本文链接:https://www.haomeiwen.com/subject/rklepttx.html