var a = 2
function foo(){
var a = 3
console.log(a)
}
foo()//3
console.log(a)//2
var a = 2
function foo(){
a = 3
console.log(a)
}
foo()//3
console.log(a)//3
个人理解
当所处的函数并没有变量声明 ,他会往上层作用域查找,直到顶层作用域,如果顶层作用域也没有变量声明,非严格模式的情况下,在顶层作用域会声明一个变量。
第二个函数此时本作用域没有声明而上层有,左查询的过程中就会吧上层变量覆盖。
而第一个函数本函数中有 var a 接收左查询,欺骗词法作用域。不会再往上寻找。
为什么第一个函数在执行之后并没有覆盖上层变量
我对于这个理解不同函数拥有不同的作用域,左查询在当前和上一级逐级查找,找到就去覆盖
var a = 2
function foo(){
a = 3
console.log(a)
var a
}
foo()//3
console.log(a)//2
函数内可以去访问函数外的变量,但是函数外部不会默认去访问函数内部变量,除非函数暴露变量
【学霸小笔记】