你不知道的JavaScript(上卷)[试读]
1.1 编译原理
几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个值进行访问或修改。事实上,正是这种储存和访问变量的值的能力将状态带给了程序。 若没有了状态这个概念,程序虽然也能够执行一些简单的任务,但它会受到高度限制,做不到非常有趣。 但是将变量引入程序会引起几个很有意思的问题,也正是我们将要讨论的:这些变量住在哪里?换句话说,它们储存在哪里?最重要的是,程序需要时如何找到它们? 这些问题说明需要一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。这套规则被称为作用域。 但是,究竟在哪里而且怎样设置这些作用域的规则呢? 1.1 编译原理 尽管通常... 查看全部[ 1.1 编译原理 ]
1.2 理解作用域
我们学习作用域的方式是将这个过程模拟成几个人物之间的对话。那么,由谁进行这场对话呢? 1.2.1 演员表 首先介绍将要参与到对程序var a = 2; 进行处理的过程中的演员们,这样才能理解接下来将要听到的对话。 • 引擎 从头到尾负责整个JavaScript 程序的编译及执行过程。 • 编译器 引擎的好朋友之一,负责语法分析及代码生成等脏活累活(详见前一节的内容)。 • 作用域 引擎的另一位好朋友,负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。 为了能够完全理解JavaScript... 查看全部[ 1.2 理解作用域 ]
1.3 作用域嵌套
我们说过,作用域是根据名称查找变量的一套规则。实际情况中,通常需要同时顾及几个作用域。 当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此,在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量, 或抵达最外层的作用域(也就是全局作用域)为止。 考虑以下代码: function foo(a) { console.log( a + b ); } var b = 2; foo( 2 ); // 4 对b 进行的RHS 引用无法在函数foo 内部完成,但可以在上一级作用域(在这个例子中就是全局作用域)中完成。 因此,回顾一下引擎和作用域之... 查看全部[ 1.3 作用域嵌套 ]
1.4 异常
为什么区分LHS 和RHS 是一件重要的事情? 因为在变量还没有声明(在任何作用域中都无法找到该变量)的情况下,这两种查询的行为是不一样的。 考虑如下代码: function foo(a) { console.log( a + b ); b = a; } foo( 2 ); 第一次对b 进行RHS 查询时是无法找到该变量的。也就是说,这是一个“未声明”的变量,因为在任何相关的作用域中都无法找到它。 如果RHS 查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出ReferenceError 异常。值得注意的是,ReferenceError 是非常重要的异常类型。 相较之下... 查看全部[ 1.4 异常 ]
1.5 小结
作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用LHS 查询;如果目的是获取变量的值,就会使用RHS 查询。 赋值操作符会导致LHS 查询。=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。 JavaScript 引擎首先会在代码执行前对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤: 1. 首先,var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。 2. 接下来,a = 2 会查询(LHS 查询)变量a 并对其进行赋值。 LHS 和RHS 查询都... 查看全部[ 1.5 小结 ]
书名: 你不知道的JavaScript(上卷)
作者: [美] Kyle Simpson
出版社: 人民邮电出版社
译者: 赵望野 | 梁 杰 | 梁杰
出版年: 2015-4
页数: 195
定价: 49.00元
装帧: 平装
ISBN: 9787115385734