这里,JS引擎在全局作用域中查找不到b,所以会抛出一个异常。所以可以明确的道理是,foo的作用域和foo1的作用域仍然是相互独立的,不会因为调用时候的顺序而更改作用域的嵌套顺序,静态作用域在代码书写时就已经确定无法更改了,明白这一点在分析JS代码的时候尤为重要。
坑外话
变量的遮蔽效应
在函数中定义的变量会遮蔽上层作用域中同名的变量,两个变量互不影响。
var a = 1; function foo() { var a = 2; console.log(a); // 2 } console.log(a); // 1
Try-Catch 中的块级作用域
try-catch的catch中会创建一个块级作用域,该作用域内变量的表现同样遵守变量的声明提升规则。
try { throw undefined; }catch(e) { a = 1; console.log(e); // undefined } console.log(a); // 1, 变量提升规则 console.log(e); // ReferenceError,catch的块作用域中定义的变量
隐式声明
以参数形式传入的变量在函数内部实际上存在的隐式的声明,使用时不算作未声明的变量。
function foo(a) { a = 1; console.log(a); } foo(); // 1 console.log(a); // ReferenceError
本来想一篇文章写完作用域和闭包的,想例子实在是累,就拆作两篇吧,逃~