通过JS运行机制的角度说说作用域(2)

这里,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

本来想一篇文章写完作用域和闭包的,想例子实在是累,就拆作两篇吧,逃~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/49e2f4c8d48b1e00cbb6c164154c2285.html