像这样的javascript代码
function foo (x = 2,y = function(){return x;}){
var x = 5;
console.log(y()) // 2
}
foo();
控制台输出2,它看起来像参数有自己的范围,关闭参数x .until我看到这个结果:
function foo (x = 2,y = function(){return x;}){
x = 5;
console.log(y()) // 5 WTF?
}
foo();
控制台输出5.这真的让我感到困惑。关键字var是否重新声明并被忽略?但看起来不像这样。 在这种情况下,这段代码如何真正起作用?
答案 0 :(得分:0)
使用x
/ var
/ let
时,const
的范围已本地化。
在参数列表中y
定义y = function(){return x;}
时,在定义表达式时定义x
和y
的范围功能 foo
。
在使用var
时,x
的范围会再次本地化,而较旧的y
仍会保留较早的x
绑定。
即使将参数传递给foo
foo(1,function(){});
如果5
未被使用,仍会输出var
(并且变量的范围未被定位,因此使用新值),但{{1}该值被覆盖,它给出了var
。