【谜之前端】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 */
恳求解答,非常感谢!
人人须日日改过,一旦无过可改,即一日无步可过矣。若发现不妥的点请务必指出,非常感谢。

浙公网安备 33010602011771号