#你不知道的javascript上卷#(5)动态作用域 词法作用域

动态作用域、词法作用域

javascript的作用域就是词法作用域,事实上大部分的语言都是基于词法作用域

词法作用域:是一套关于引擎如何寻找变量以及会在何处找到变量的规则,

词法作用域:最重要的特征是他的定义过程发生在代码的书写阶段(假设你没有使用eval()或 with)

动态作用域似乎暗示有很好的理由让作用域作为一个在运行时就被动态确定的形式,而不是在写代码的时进行静态确定的形式,事实上也是这样的,例子说明

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

这个代码最终的输出是 2

因为词法作用域:是在代码或者说定义时确定的,而动态作用域:是在运行时候确定的(this也是)

        词法作用域:关注函数在何处声明, 而动态作用域:关注函数在何处调用

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

如果是动态作用域的话,当foo()无法找到a的变量引用时,会顺着调用栈在调用foo()的地方查找a, 而不是在嵌套的词法作用域链中向上查找,由于foo()是在bar()中调用的,引擎会检查bar()的作用域 ,所以要是是动态作用域的话输出的a的值就是3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值