说一说词法作用域和动态作用域

作用域和 this 一直是困扰我们大多数人的问题,这其中的规则初看时总觉得太过复杂,如果想要有更多更深的理解,就需要将此处的原理好好剖析开来,万物不离其原理,只有基础好了才能更进一步。

JavaScript 有一套对于变量进行存储和操作的规则,存储参照我的另一篇博客《JS数据类型及存储和判断方式》,而这个操作的规则就是作用域。

那什么是词法作用域呢?

这个在代码编译的时候就已经确定了。在这个阶段,会规定在作用域内对于变量的查找规则,我们称之为词法作用域,也称静态作用域
而与之对应的是动态作用域

静态作用域在代码编译的时候确认,动态作用域在代码执行的时候确定的。
JavaScript 使用的是静态作用域。

var value = 3;
function printValue() {
    console.log(value)
}
function foo() {
    var value = 4;
    printValue();
}

foo();

按照我们前面提到的,JavaScript 使用的是静态作用域,所以在考虑这段代码的输出结果时,应该从静态作用域的角度去考虑。

  1. 执行 foo 函数。
  2. 在 foo 函数内部执行 printValue 函数。
  3. printValue 在自己内部没有 value 变量,于是按照词法作用域的规则,沿着被定义时的作用域链向上查找到全剧作用域内的 value。
  4. 打印3。

为了更清楚地认识到静态作用域和动态作用域的规则,我们再从动态作用域的角度去运行一下这段代码。

  1. 执行 foo 函数。
  2. 在 foo 函数内部执行 printValue 函数。
  3. printValue 在自己内部没有 value 变量,按照动态作用域在代码被执行时确定的规则,他被 foo 调用,于是沿着动态作用域在 foo 中找到value。
  4. 打印4。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值