使用“var”或无关键字分配变量

时间:2018-03-06 10:41:59

标签: javascript

(function foo() { var a=b=c=1 }())

当我尝试记录时,将返回未定义的错误,但是,当我尝试记录b或c时,将返回值1.这是邪恶的。

3 个答案:

答案 0 :(得分:4)

bc会添加到窗口对象中,并将其值设为1。但a是通过var声明的。这意味着a仅在函数上下文中可见,而不在其外部。

您的代码是等效的

(function foo() { 
   c = 1;
   b = c;
   var a = b;
}())

答案 1 :(得分:0)

  

但是,当我尝试记录b或c时,将返回值1。

因为您没有使用bcvarletconst的范围(功能内)进行本地化。

如果没有varletconst,这些变量将采用定义此函数的范围

如果外部作用域(不是最外部)也没有本地化这些变量,则再次检查父作用域,直到最外部作用域(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);