【谜之前端】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  */
复制代码
恳求解答,非常感谢!
 
 
人人须日日改过,一旦无过可改,即一日无步可过矣。若发现不妥的点请务必指出,非常感谢。
posted @   不乏理想的三师弟  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示