最近在一个讨论群看到一个面试题:
{
a = 10;
function a(){};
console.log(a)//10
};
console.log(a);//10
what?不应该是:function a(){} 、function a(){} 吗?
最后一位牛人给出了他的理解,这里本人只是作出验证,加深理解。
环境默认都是chrome环境,支持ES6。
下文提出的默认变量指的是没有使用 var、let、const定义的变量。
块级作用域的默认变量
我们先看这样一个 :
console.log(a);//ReferenceError: a is not defined
{
a = 10;
console.log(a)//10
}
console.log(a);//10
可能有些人会像我一样感到诧异:为什么第一个a打印出来的不是undefined?a = 10默认不是 var a = 10吗?应该会提升到全局作用域的顶端的啊。
那好,让我们把window.a打印出来看看:
console.log(window.a);//undefined
{
console.log(window.a,a);//undefined 、a is not defined
a = 10;
console.log(window.a,a)//10 10
}
console.log(window.a,a);//10 10
结论:我们可以清晰的看到,在块级作用域中默认声明的变量,只有执行了声明代码,变量才会被挂载到全局作用域上。
让我们在看看使用var声明的变量的情况:
console.log(window.a,a);//undefined undefined
{
console.log(window.a,a);//undefined 、undefined
var a = 10;
console.