你不知道的JavaScript读书笔记

在福昕阅读器中,"适配宽度"阅读模式后,点击标签跳转,又回“适合页面”,设置办法:Ctrl+K 弹出:“偏好设置“,“页面显示”,勾选最后一个复选框即可

在第 2 章中, 我们对比了动态作用域和词法作用域模型, JavaScript 中的作用域就是词法作用域( 事实上大部分语言都是基于词法作用域的)。

而动态作用域并不关心函数和作用域是如何声明以及在何处声明的, 只关心它们从何处调用。 换句话说, 作用域链是基于调用栈的, 而不是代码中的作用域嵌套。

词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规
则。 词法作用域最重要的特征是它的定义过程发生在代码的书写阶段( 假设你没有使用
eval() 或 with)。

function foo() {
console.log( a ); // 2
}
function bar() {
var a = 3;
foo();
}
var a = 2;
bar();

词法作用域让 foo() 中的 a 通过 RHS 引用到了全局作用域中的 a, 因此会输出 2。

需要明确的是, 事实上 JavaScript 并不具有动态作用域。 它只有词法作用域, 简单明了。
但是 this 机制某种程度上很像动态作用域。
主要区别: 词法作用域是在写代码或者说定义时确定的, 而动态作用域是在运行时确定
的。( this 也是! ) 词法作用域关注函数在何处声明, 而动态作用域关注函数从何处调用。

推荐阅读更多精彩内容