JS面试题,等一个大佬出现,解决小弟的疑惑

正确答案为0,-8,-14,-14
执行fn(1),全局i=4,私有n=1。
执行f(2),全局i=0,私有n=0。

执行fn(3)(4),全局i=-8 (n--后为2,这里的n我用在了下段代码的计算中,并且导致和正确答案不相符,如果是用2计算的话,下段执行i为0)。

执行f(5),全局i=-14 {使我想不通的是,为什么此段代码中的n不是fn(3)(4)执行后的n,而是fn(1)中的n}
console.log(i) //-14

      let i=2
        let fn=function(n){
            i*=2
            return function(m){
                i-=(n--)+(++m)
                console.log(i)
            }
        }
        let f=fn(1)
        f(2)
        fn(3)(4)
        f(5)
        console.log(i)


阅读 4.2k
7 个回答

每次执行fn都会返回一个新的匿名函数 你的fn(1)返回来的函数已经用一个f变量缓存起来了 所以后面调用f(2)
f(5) 里面n都是fn(1)里的那个1
fn(3)(4) 首先执行fn(3) 返回来一个匿名函数 这个匿名函数和fn(1)返回来的匿名函数 虽然作用是一样 但其实是两个匿名函数

你第一次执行f(2) n的值已经变成了0
第二次执行f(5)的时候 i = -8; m = 5; n = 0
所以i-=(n--)+(++m)的值为-14

理解下闭包,++n与n++的区别后,这道题就是个算术题

需要认真才行(老司机的我也不够认真,导致翻了下车?)

我的理解是当你执行let f=fn(1)时,就已经形成了一个闭包,n变成了处在这个闭包里面的局部变量,后面再执行f(3)也只是形成了另外一个闭包,与f无关,所以n不是fn(3)(4)执行后的n,而是fn(1)中的n。

好题目,算了半天才对

f是哪来的?是执行fn(1)得来的,和fn(3)(4)毫无关系

这是两个独立的闭包。这题目不难,但是需要比较仔细的推算

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题