(function foo() { var a=b=c=1 }())
当我尝试记录时,将返回未定义的错误,但是,当我尝试记录b或c时,将返回值1.这是邪恶的。
答案 0 :(得分:4)
b
和c
会添加到窗口对象中,并将其值设为1
。但a
是通过var
声明的。这意味着a
仅在函数上下文中可见,而不在其外部。
您的代码是等效的
(function foo() {
c = 1;
b = c;
var a = b;
}())
答案 1 :(得分:0)
但是,当我尝试记录b或c时,将返回值1。
因为您没有使用b
或c
或var
对let
和const
的范围(功能内)进行本地化。
如果没有var
,let
或const
,这些变量将采用定义此函数的范围。
如果外部作用域(不是最外部)也没有本地化这些变量,则再次检查父作用域,直到最外部作用域(window
)。如果没有为它们定义局部范围,则变量将添加到最外层范围。例如
function a() {
(function foo() {
var a = b = c = 1;
}());
console.log(b, c); //print 1,1
}
a();
console.log(b, c); //print 1,1
但是,如果在外部作用域中定义了这些变量,则它们不会添加到最外层(window
)作用域。例如,以下将抛出错误。
function a() {
var b,c;
(function foo() {
var a = b = c = 1;
}());
a();
console.log(b, c);
}
console.log(b, c);
答案 2 :(得分:0)
如果您有许多构造要初始化为某些常量,并且您可以使用ES6功能,则以下是一种很好的方法。
//store function in your lib
function* initVar(value) {
while (true) yield value;
}
//using function
let
[a,b,c] = initVar(0),
[d,e,f] = initVar("xyz"); //not just limited to numbers.
console.log(a,b,c,d,e,f);