为了账号安全,请及时绑定邮箱和手机立即绑定

闭包经典面试题,请教各位

闭包经典面试题,请教各位

慕标5832272 2019-03-22 22:19:28
首先是一道前端经典闭包面试题。for(var i = 0;i<5;i++){  setTimeout(()=>{    console.log(i)  },1000*i)}这题大家都知道答案是每隔1秒打出5。然后面试官让改成每隔1秒输出正确数字,你知道使用闭包:function a(j){  setTimeout(()=>{     console.log(j)  },1000*j)}for(var i = 0;i<5;i++){  a(i)}但是这样的做法只是使用函数作用域保存了i的值,让定时器执行回调时所找到的变量值是每次循环对应的值,而闭包的作用是让函数外部间接访问到函数内部的值。所以简单来说我觉得这道题不是闭包的作用,而仅仅是函数作用域的作用。不知道我的理解对不对。
查看完整描述

7 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

for(let i = 0;i<5;i++){

  setTimeout(()=>{

    console.log(i)

  },1000*i)

}//0,1,2,3,4


查看完整回答
反对 回复 2019-03-27
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

一般这种套路让你写的是立即执行函数表达式,当然更任性的会改成let。


for(var i = 0;i<5;i++){

  (setTimeout((j)=>{

    console.log(j)

  },1000*j))(i)

}

闭包应该是指的原题,setTimeout的callback引用了不属于其作用域的变量i,i在原有的作用域上无法释放。当然,你也可以理解为所有的异步操作都是闭包。


你不知道的JavaScript中关于闭包的定义


当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时

就产生了闭包。-----你不知道的JavaScript

你回答的答案没错,但是作用域和闭包密切相关,这里很容易觉得没有闭包,但事实上这是关于词法作用域的问题,以下两段代码,1在词法作用域内,2在词法作用域外。


function a(){

    function b(){

    }

}

function a(){

    setTimeout(function b(){

    },0);

}


查看完整回答
反对 回复 2019-03-27
?
慕森王

TA贡献1777条经验 获得超3个赞

你说对了……一半!


function a(j){

  setTimeout(()=>{ // callback

     console.log(j)

  },1000*j)

}

for(var i = 0;i<5;i++){

  a(i)

}

这是一个作用域问题,同时也是一个闭包问题。


关键点在于setTimeout定时器所执行的函数会脱离当前的作用域,callback函数并不是在a函数的作用域中执行的,其中的j是a中那个j的闭包变量。


换句话说,如果没有闭包,callback函数中访问到的将是undefined(或报错)。


查看完整回答
反对 回复 2019-03-27
?
万千封印

TA贡献1891条经验 获得超3个赞

一句话,在 js 中,函数参数是按照值来传递的


查看完整回答
反对 回复 2019-03-27
?
SMILET

TA贡献1796条经验 获得超4个赞

闭包是函数内部有权访问函数外部的变量,不是外部访问内部

首先看下完整版 破解前端面试(80% 应聘者不及格系列):从 闭包说起

其实主要利用了基本类型在函数调用时,按值传递的,所以就能拿到不同时期 i 对应的值,跟闭包没多大关系。


查看完整回答
反对 回复 2019-03-27
?
holdtom

TA贡献1805条经验 获得超10个赞

没毛病,但是这俩概念也不冲突啊,不传参数,直接用函数外的值就不是作用域了吗,也是作用域啊。
我一直觉得用到外部作用域的变量或者值都算闭包,把闭包当作一个现象比较好,作用域是原因,什么执行完不销毁还保持引用就是个“特殊”的作用域现象。

查看完整回答
反对 回复 2019-03-27
?
烙印99

TA贡献1829条经验 获得超13个赞

闭包的预期行为就是把对外部内存的引用封进函数里,只是JS程序员对指针内存地址之类的比较没有概念,会认为第一种情况是错误的,其实那才是正确的表现。

至于怎么把结果改成第二种情况就跟闭包这一概念无关了,不同语言有不同的解决方式,JS里大家经常踩进这坑比较津津乐道。


查看完整回答
反对 回复 2019-03-27
  • 7 回答
  • 0 关注
  • 596 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信