资讯专栏INFORMATION COLUMN

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

2501207950 / 433人阅读

摘要:之三关于闭包和递归开篇这一期本来是打算写闭包的,但是无意中看到高级程序设计中闭包的前一章就是递归。闭包练习题这个板块会实时补充的关于递归其实说到递归,主要就是要说这个的用法,其实主要就是调用自己的外围函数,并且可以传参。

之三:关于闭包和递归 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操作,一起加油哟!

欢迎大家指出不足和意见,我会虚心接受

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80122.html

相关文章

  • JavasScript重难点知识

    摘要:忍者级别的函数操作对于什么是匿名函数,这里就不做过多介绍了。我们需要知道的是,对于而言,匿名函数是一个很重要且具有逻辑性的特性。通常,匿名函数的使用情况是创建一个供以后使用的函数。 JS 中的递归 递归, 递归基础, 斐波那契数列, 使用递归方式深拷贝, 自定义事件添加 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果...

    forsigner 评论0 收藏0
  • JavaScript - 收藏集 - 掘金

    摘要:插件开发前端掘金作者原文地址译者插件是为应用添加全局功能的一种强大而且简单的方式。提供了与使用掌控异步前端掘金教你使用在行代码内优雅的实现文件分片断点续传。 Vue.js 插件开发 - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins译者:jeneser Vue.js插件是为应用添加全局功能的一种强大而且简单的方式。插....

    izhuhaodev 评论0 收藏0
  • 关于个人第一天前端面试面试问答QA,希望能对其他找前端工作的朋友有所帮助。

    摘要:两日前,发了一篇吐槽,莫名的火了一把。关于的第一个,其实就是声明一个常量,不允许变更。另外对象迭代这里出自,阮一峰大神写的入门指南,对象篇。 两日前,发了一篇吐槽,莫名的火了一把。经过大家的建议与鼓励,于是修改了简历,开始了重新投递,2天后接到第一份面试邀请。 此文为个人面试经历,QA问答过程与总结,不透露面试公司及面试人员,内容真实,如果有面试过我的大佬看到博客,欢迎指出问题。 循序...

    Youngdze 评论0 收藏0
  • 前端知识点整理

    摘要:难怪超过三分之一的开发人员工作需要一些知识。但是随着行业的饱和,初中级前端就业形势不容乐观。整个系列的文章大概有篇左右,从我是如何成为一个前端工程师,到各种前端框架的知识。 为什么 call 比 apply 快? 这是一个非常有意思的问题。 作者会在参数为3个(包含3)以内时,优先使用 call 方法进行事件的处理。而当参数过多(多余3个)时,才考虑使用 apply 方法。 这个的原因...

    Lowky 评论0 收藏0

发表评论

0条评论

2501207950

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<