var a = 100
{
a =99
function a() { }
a = 30
}
console.log(a) // 99
这里面要区别a
a有两个 一个是全局变量a 一个是{}作用域中的function a
a = 99 是给全局变量a赋值, a=30是给function a赋值
这是因为js中变量作用链的关系
首先理解当前这个问题,
1、首先肯定要知道的是里面不涉及异步操作,必然是从上到下执行,
2、用var去声明一个变量则是绑定在window上面
3、作用域当中的函数是带有着变量提升的
疑点:
1、a为什么是99?而不是30?
2、如果只是从作用域的角度来看问题的话,那为什么a不为100?
从上到下捋一遍:
var a = 100;
{
console.log(1, window.a, a); //1 100 ƒ a() {} // 函数先执行 变量提升 所以在这边其实 a 是作用域当中的 function a() {}
a = 99;
console.log(2, window.a, a); //2 100 99 // 执行了 a = 99后 其实变更的是作用域当中的 a 这个时候 window.a 其实是没有任何变化的还是 100
function a() {} // 主要看着一步 在块级作用域中函数声明这个函数变量则会被提升到顶层 ,就是因为这一步抓取执行操作 此时因为块级作用域中的a是99 那么这时 对应window.a 也就是全局作用域中的 a也就被提升为了99
console.log(3, window.a, a); //3 99 99 // 这时因为块级作用变量被提升为全局作用变量所以window.a就变成了99
a = 30; // 而这个时候因为没有了块级作用提升所以 a 这时变更的是块级作用域中的a
console.log(4, window.a, a); //4 99 30 最后其实是这样的一个结果
// function a() {} // 而且如果这个时候我再次声明一次function a(){} 那么则变量又会提升 最终的结果也就会变成 30
}
console.log(a);//99
如果有不懂得地方可以参考一下
https://zhuanlan.zhihu.com/p/100856823