分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

分享一段有意思的JS面试题

发布时间:2023-09-06 02:32责任编辑:沈小雨关键词:面试题
上代码
?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面试题

原文地址:https://www.cnblogs.com/focusoldman/p/10341302.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved