1》先找本层(本作用域) ===> 逐级向外查找
#在内部console.log打印a,结果为20。因为先找本层的,如果本层有,则直接返回;
#如果本层没有,向外部逐级找。
2》优先级
由高到低: 变量> 函数> 参数> 提升
提升是什么?
所谓变量提升, 即函数任意地方声明变量都可以,就相当于是在顶部声明了(只是声明了而已,并不是赋值)
举个例子:
首先代码是从上往下执行的,如果不声明变量,直接打出a,肯定会报错!
如果在console.log(a)上面写出var a(不赋值),会显示undefined
如果在console.log(a)下面写出var a = 20;(并赋值),仍然显示undefined
那么这就是提升。也就是说,在12行以上的代码中并没有a,(代码从上往下执行),本应该报错,但却没有,而是弹出undefined。所以,由于在13行声明了a,那么在11行的位置,隐式的有var a;(没有赋值)。
但这种情况仅限于局部变量(局部变量才会提升),写window.a和直接写a都不行。
window.a :
a:
如果有实参5,和形参num,那么会打印出5,而不是undefined。