之所以想起再来温习一遍js的作用域,及js变量解析方式,是因为今天的公司下面的这道题,很显示我挂掉了。好逮也是老前端了 ,不称职。
上代码
//6. What will be written to the console for the following code snippet?
(function () {
var a = [1];
function bar() {
if (!a) {
var a = [1, 2];
}
console.log(a.join());
}
bar();
})()
我直接给了一个1,结果可想而知,看正确的答案
[1,2]
在js中,变量的声明会被解析器悄悄的提升到方法体的最顶部,但是需要注意的是,提升的仅仅是变量的声明,变量的赋值并不会被提升。
怎么理解???比如上面的bar函数虽然var a=[1,2]在if判断中并没有运行,但是js在解析时会先将var a=[1,2]在bar的顶部先进行申明也就是提升,看如下面的代码,忘提 了关键的是他不会提升变量的值。也就是说a在此时始终是undefinded,也就是仅仅只是申明确没有赋值;
//js实际解析是这样的
function bar() {
var a;
if (!a) {
console.log(a); //undefinded 测试a的值
a = [1, 2];
}
console.log(a.join()); //[1,2]
}
是不是有种错觉,函数内部访问不到全局变量了。肯定不是。只是因为javascript解析关系.a被重新覆盖了.