js var到底有几层意思

如下一段代码:

 var a = 'a';

 say();

 function say() {
     console.log(a);
     var a = 'b';
     cosnole.log(a);
 }

为何会返回undefined?

var申明的变量会预定义赋值为undefined,访问的并不是window下的a,你的代码等价于下面的

  function say() {
   var a=undefined;
     console.log(a);
     a = 'b';
     cosnole.log(a);
 }

javascript运行机制

我个人所了解的:var 可以代替整型,字符串,boolean类型
看你上面的代码:第一个consol.log(a),应该输入的 a
第一个consol.log(a),应该输入的 b 吧原来的a='b'覆盖了a='a'

当然是undefined,!作用域的概念先搞清楚,!!var 出现是定义变量,在全局域和 say函数域都用定义a,所以console.log读取的是say域的a变量,同时又早于它初始化的语句,所以还没来得及初始化a的值。

解决方法有两:!去掉say函数的var关键字!!将var行的内容放到say函数的开头。

唉,竟然看到回答者360被请出门外了

ask.csdn.net为毛老这样,点“我要回答”没反应也没提示,等我多点几下就发了好几条出去了。

这不是var有几层意思的问题,是关于变量的作用域和提前声明的问题,上面的代码可解释成
var a = 'a'; //全局变量a,值为"a"

say();

function say() {
 console.log(a);   //此处的a在下面已声明,但还未定义,所以会输出undefined
 var a = 'b';     //声明一个局部变量a,在整个函数体内有效
 cosnole.log(a);   //输出b

}
上面的代码可改写成如下:
var a = 'a';

say();

function say() {
var a;
console.log(a);
a = 'b';
cosnole.log(a);
}
关于undefined的解释,如果是变量时,表明变量未初始化,对于一些基础,我建议可以看看《javascript 权威指南》