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

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闭包经典例题的更多相关文章

  1. 170106、用9种办法解决 JS 闭包经典面试题之 for 循环取 i

    闭包 1.正确的说,应该是指一个闭包域,每当声明了一个函数,它就产生了一个闭包域(可以解释为每个函数都有自己的函数栈),每个闭包域(Function 对象)都有一个 function scope(不是 ...

  2. 用9种办法解决 JS 闭包经典面试题之 for 循环取 i

    2017-01-06 Tomson JavaScript 转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明 ...

  3. 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】

    首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...

  4. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  5. js闭包的作用

    js闭包的用途详解 js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文   我们来看 ...

  6. javascript深入理解js闭包(转)

    javascript深入理解js闭包 转载  2010-07-03   作者:    我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

  7. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  8. C语言经典例题100

    C语言经典例题100 来源 http://www.fishc.com 适合初学者 ----------------------------------------------------------- ...

  9. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

随机推荐

  1. Linux 分区初始化为物理卷,把物理卷加入卷组

    用到的命令有 1.pvcreate (physical volume create) 2.vgcreate (volume group create) 例子1:创建物理卷 pvcreate /dev/ ...

  2. linux的nohup命令的用法。

    在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会 用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/m ...

  3. [方法] ubuntu12.04开启root账户

    ubuntu 12.04使用LightDM显示管理器,默认禁止root账户登录. 通过修改/etc/lightdm/lightdm.con文件可以打开root登录权限. 方法很简单,只要在lightd ...

  4. iOS 数组里面取字典的值

    NSArray *arrData = @[@"1",@"2",@"3",@"4"]; NSArray *arrKey = ...

  5. javascript数组去重算法-----4(另一种写法__2)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. SQL学习之空值(Null)检索

    在创建表表,我们可以指定其中的列包不包含值,在一列不包含值时,我们可以称其包含空值null. 确定值是否为null,不能简单的检查是否=null.select语句有一个特殊的where子句,可用来检查 ...

  7. WPF属性与特性的映射(TypeConverter)

    1,定义一个类 public class Human { public string Name { get; set; } public Human Child { get; set; } } 2在X ...

  8. 菜鸟初试水--JQuery基础

    此文仅作入门级文章,望大神们高抬贵手! JQuery: 它是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作. JQuery的用途: ①访问和操作DOM元素: 使用j ...

  9. 用C++写一个简单的发布者

    节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...

  10. xhprof

    #官网下载 http://pecl.php.net/package/xhprof tar zxf xhprof-0.9.2.tgz   cd xhprof-0.9.2/extension/   sud ...