【口试系列】之三:关于闭包和递归

之三:关于闭包和递归

1. 开篇

这一期本来是盘算写闭包的,然则无意中看到《JavaScript高等程序设计》中闭包的前一章就是递归。
所以拿出来一同讲一下吧!

我以为闭包算是笔试口试中常考的,当口试官问道闭包的时刻。也许人人都邑说上:从表象上看,闭包是内部函数援用外部函数的变量,致使内部函数援用的变量不会被开释。纵然外部函数被烧毁时,变量依旧驻留在内存中!
但是人人真的懂这句话的意义吗(在深切相识之前,我也不邃晓)
本日就让我们来好好相识一下:

2. 闭包的道理

先看一段代码:


// 需求时是一秒钟以后,在控制台依此输出1-10
function numberLog() {
    for (var i = 1;i <= 10;i++) {
        setTimeout(function () {
            console.log(i)
        }, 1000)
    }
}
numberLog();

人人以为上面的代码,能完成预期的需求吗?
固然不能,代码的实行速率很快,我们轮回了十次,生成了十个setTimeout(function(){console.log(i)}, 1000)
然后当一秒钟过去了,i早就变成11了,所以末了就会输出10个11

那末怎样革新呢?
看这段代码:

function numberLog() {
    for (var i = 1;i <= 10;i++) {
        (function (count) {
            setTimeout(function () {
                return console.log(count)
            }, 1000)
        })(i)
    }
}
numberLog();

此次再看一下,在控制台上会输出1-10
这是为何?实在看不懂也没有关联,就是简朴的举了一个闭包的运用场景。

下面详细说一下,只需要记着以下几点:

  • 当一个函数实行时,全局会为这个函数做两件事:1.构建一个自力的函数环境 2.把全局的变量用作用域链的情势推给这个函数,换句简朴的话说就是让这个函数能够访问到它外层定义的变量,并能够一层一层的向外援用
  • 假如一个函数内里嵌套了一个函数,而且这个内部函数援用外层函数的变量,谁人这个变量就不能在外层函数完毕后被开释(正常是函数挪用完,环境和变量就都邑被开释),因为不知道内部函数在什么时刻就会被挪用。

那上面这个例子是怎样回事呢?
我们能够看到在轮回代码内我们实行了一个函数马上挪用,而且返回一个console.log(XX)
因为马上挪用的这个函数援用了外部函数numberLog的变量i,因而i从1-10都不会被开释,都邑在内部构成一个闭包空间。
当一秒钟过去,照样会打印出 1-10

不知道这么说,你邃晓没有,不太懂的话请看书《JavaScript高等程序设计》第七章闭包那一节。

3. 闭包练习题

这个板块会及时补充的

4. 关于递归

实在说到递归,重要就是要说callee这个的用法,callee实在重要就是挪用本身的外围函数,而且能够传参。
下面我们来看一个题(我口试百度时的题):

// 用setTimeout来模仿setInterval

先留个牵挂哈!

5. 末了

本日是周日,下周会有一个百度糯米的口试!如今觉得本身的js的基本有些柔弱,
所以下一节会说一下js原生的dom操纵,一同加油哟!

迎接人人指出不足和看法,我会虚心接受

    原文作者:bradwang
    原文地址: https://segmentfault.com/a/1190000006669394
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞