【谜之前端】JavaScript中“参数默认值”的存在造成了异常现象!?
在此求解一段代码,感谢!
1 function test1(a=1) { 2 console.log(a) // 无参/带参调用test1(): [Function: a] 3 function a() {} 4 } 5 function test2(a=1) { 6 console.log(a) // 无参调用test2():1 带参调用test2(2): 2 7 var a; 8 function a() {} 9 } 10 function test3(a) { 11 console.log(a) // 无参/带参调用test3(): [Function: a] 12 var a; 13 function a() {} 14 }
这里不是本文讨论的要点,但我必须要指出来:
对比一下test2与test3:它们有着同样的方法体,差别仅是有否默认参数;可这居然导致了执行test2(2)与test3(2)时输出两个不同的结果(既然都传递了参数,那么输出结果应该都相同啊!?)
分析开始
相关的规则:
1)函数声明和变量声明都会被提升。但是一个值得注意的细节是函数会首先被提升,然后才是变量。——摘自《你不知道的JavaScript(上)》中P40
2)重复的var 声明会被忽略掉,但出现在后面的函数声明还是可以覆盖前面的。——摘自《你不知道的JavaScript(上)》中P41
根据这俩规则可以很顺利地理解test3方法:
1 /** 2 * 进行var a变量声明提升 3 * 声明函数function a(){}, 之前的var a声明被覆盖 4 * 最后执行console.log(a) => [Function: a] 5 */ 6 function test3(a) { 7 console.log(a) // [Function: a] 8 var a; 9 function a() {} 10 }
重点来了,现在感觉test1()方法也能这样去理解它的输出,可当我再看了看test2()方法时,我傻了!
1 function test1(a=1) { 2 console.log(a) // [Function: a] 3 function a() {} 4 } 5 function test2(a=1) { 6 console.log(a) // 1 7 var a; 8 function a() {} 9 } 10 /** 11 * 如果默认参数值不造成对上述规则2)的影响(可以说是冲击吧;我膜拜该书为经典,在这里作为推断规则引用) 12 * test2方法中的var a 中将会被function a(){}所覆盖, 13 * 如果这样那么方法test1与test2岂不是具有相同功能的方法?! 14 * 15 * 我猜测:默认参数值的存在确实对上述的规则2)造成影响, 16 * 而输出的结果确实被“var a是否存在于那个位置”所影响。 17 * 我不懂,恳求解答 18 */
恳求解答,非常感谢!
人人须日日改过,一旦无过可改,即一日无步可过矣。若发现不妥的点请务必指出,非常感谢。
分类:
【谜之前端】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!