词法作用域

作用域是指程序源代码中 定义变量的区域 。其规定了 如何查找变量 ,也就是确定当前执行代码对变量的访问权限。

词法作用域是指作用域是由代码中 函数声明的位置 来决定的,所以词法作用域是静态的作用域,通过它就能够预测代码在执行过程中如何查找标识符。

也就是说,词法作用域是代码阶段就决定好的,和函数是怎么调用的没有关系

静态作用域

词法作用域,函数的作用域在函数定义的时候决定。

var value = 1

function foo() {
  console.log(value)
}

function bar() {
  var value = 2
  foo()
}

bar() // 1

静态作用域执行过程: 执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value ,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。

动态作用域

动态作用域,函数的作用域在函数调用的时候决定。

var value = 1

function foo() {
  console.log(value)
}

function bar() {
  var value = 2
  foo()
}

bar() // 1

动态作用域执行过程: 执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value 。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。

参考

Last Updated:
Contributors: Vsnoy