在作用域中首先要处理两件事:
- 形参赋值
- 变脸提升
下面几道题
<script> window.onload = function () { test4(); } function test1() { console.log(a); var a = 12; function fn() { console.log(a); var a = 13; } fn(); console.log(a) /* a的三次输出 分别是 undefine undefine 12 */ } function test2() { console.log(a); var a = 12; function fn() { console.log(a); a = 13; } fn(); console.log(a) /* a的三次输出 分别是 undefine 12 13 */ } function test3() { console.log(a); a = 12; function fn() { console.log(a); a = 13; } fn(); console.log(a) /* 程序报错 a 没申明 */ } function test4() { var foo=1; function bar() { if(!foo) { var foo=10; } console.log(foo); } bar(); /* 10 */ } </script>
用图解说最后一题:
首先是开始的window全局作用域
然后为函数开辟堆栈内存
最后分别在各自作用域内从上往下执行代码