分享一段有意思的JS面试题
Posted focusoldman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分享一段有意思的JS面试题相关的知识,希望对你有一定的参考价值。
上代码
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)
正确答案为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
这道题确实不错,需要认真算算,否则会翻车...
迷惑我的地方,现在已经有了新的想法
每次执行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
以上是关于分享一段有意思的JS面试题的主要内容,如果未能解决你的问题,请参考以下文章