图解词法作用域与作用域链

栏目: JavaScript · 发布时间: 6年前

内容简介:在你不知道的javascript上卷中是这样定义的:在JS中词法作用域的规则:栗1:

在你不知道的javascript上卷中是这样定义的: 词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。

在JS中词法作用域的规则:

  • 函数允许访问函数外部的数据
  • 整个代码结构中只有函数可以限定作用域
  • 作用规则首先使用提升规则分析
  • 如果当前作用域中有了名字了,就不考虑外面的名字

栗1:

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

栗2:

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

作用域链

只有函数才能制造作用域结构,那么只要是代码,至少有一个作用域,即全局作用域。

凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域,那么将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构。

以上面栗2:

function foo() {
  console.log(a); // 2
}
function bar() {
  var a = 3;
  foo();
}
var a = 2;
bar();
  • 全局作用域,有三个标识符:foo、bar、a
  • bar 所创建的作用域,其中有一个标识符:a

作用域是由代码写在哪里决定的,并且是逐级包含的。

我们用级链来表示一下以上代码块:

图解词法作用域与作用域链

从图中我们可以看到:函数foo和bar以及变量 a=2, 在1级链,而bar下又可以展开2级链,2级链上有a=3。程序bar()调用进入中间2级链,而bar中又调用了foo函数,此时程序进入foo的作用域链,按照向上查找的原则,程序会从这一条链向上查找,首先2级链没有a,向上到达1级链,刚好1级链上有a=2,所以就直接使用2,程序最后的结果就是打印2。

所以无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。

实践

《JavaScript深入之词法作用域和动态作用域》 思考题

var scope = "global scope";
function checkscope(){
  var scope = "local scope";
  function f(){
    return scope;
  }
  return f();
}
checkscope();

图解词法作用域与作用域链


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数码人类学

数码人类学

[英]丹尼尔·米勒、希瑟·A.霍斯特 / 王心远 / 人民出版社 / 2014-10 / 48.00元

人类学有两大任务,一是理解什么是人,二是理解人性是如何透过多元的文化表现出来。数码科技的蓬勃发展给这两者都带来了新的作用力。《数码人类学》向读者展示了人类与数码科技如何辩证地相互定义。最终我们试图得出一个结论,那便是“数码科技对人类到底意味着什么?” 从社交网站到数字化博物馆;从数字时代政治学到电子商务,浸润式的数码科技,给普通人的生活带来了根本性的改变。仅仅用数据来说明与理解问题显然过于太......一起来看看 《数码人类学》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具