话不多说,先上代码
var a = 10;
function b () {
console.log(a);
var a = 20;
console.log(a);
}
b();
上面的结果输出是什么呢?
好了,揭晓答案:
var a = 10;
function b () {
console.log(a); // undefined
var a = 20;
console.log(a); // 20
}
b();
EMMM…下面用我自己掌握的知识解释一下^ _ ^
首先,为什么第一个打印的a不是10,而是undefined呢?首先这里涉及到一个作用域的知识
简单来说,函数 作用域 就是指变量和函数可以访问的范围。
通常情况,变量都是到创建该变量的作用域中取值,如果当前作用域没有,才会往上层作用域寻找,层层向上,直到全局作用域,其实条链就是我们所说的作用域链了。
那么我们再看回b函数里面也声明了a变量,所以不会往上层作用域去找了。那为什么是undefined呢,这就涉及到var变量提升到的问题了,实际上是这样的:
function b () {
var a;
console.log(a);
a = 20;
console.log(a);
}
好,那再稍微变一下,想想下面输出的结果是什么?
var a = 10;
function b () {
console.log(a);
a = 20;
console.log(a);
}
b();
答案就是10,20
如果变量未经声明就赋值,此变量就为全局对象所有
再看看下面这题?
var a = 10;
function b () {
var b = 1;
console.log(a); // undefined
var a = 20;
console.log(a); // 20
}
b();
console.log(b, a);
/* ƒ b () {
var b = 1;
console.log(a);
var a = 20;
console.log(a);
} 10
*/