你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些”坑”,在这里写一些博客记录一下笔记以便消化吸收。

1 编译原理

在此书中,开始便提出:Javascript是一门编译型语言,我一开始以为这是国内翻译的锅,翻译的不够准确,后来我还专门去github看了,作者确实是将Js描述为一门编译型语言(compiled language)。然而我认为作者更想表达的是Js也拥有和Java一般的特定的编译过程.而不是传统得认为只是单纯的进行”解释执行”。

编译型语言的定义是编译型语言的首先将源代码编译生成机器语言,再由机器运行机器语言,就如C/C++一般。

Java把源代码编译成为JVM可以执行的字节码,明显是不符合编译型语言的定义的,所以Java是一门解释型语言。而Javascript也拥有同Java类似的过程,但是这个过程很短。这它在代码执行前的几微秒内要完成程序的编译,然后马上执行。

Javascript的编译分为三个步骤:

a.分词/词法分析

b.解析/语法分析

c.代码生成

Javascript在编译阶段的语法分析和代码生成阶段使用了各种方法(JIT, 延迟编译, 重编译等)保证性能最佳。

2 理解作用域

书中所说的Javascript的解释和执行的过程,主要就几个角色参与:

引擎:负责编译的第一部分(分词/词法分析)和执行编译后生成的代码

编译器:负责编译的第二部分(语法分析)和编译的第三部分(代码生成)

作用域:负责收集所有声明的标识符,即变量,并且维护一套管理变量的规则
对于var a = 2;可以认为他的执行过程如下

a.引擎执行编译的第一步 分词/词法分析

b.引擎调用编译器,编译器进行编译的语法分析和代码生成

a) 编译器遇到var a,去当前的作用域集合中查找是否存在a这个变量

b) 如果存在,则忽略变量声明

c) 如果不存在,则在作用域中声明一个新的变量,命名为a

d) 生成引擎运行所需代码

c.引擎运行生成的代码

a) 去当前作用域中查找是否存在a变量,如果找不到这个变量,它会继续往上 (它的上一层作用域)寻找

b) 如果存在,会使用这个变量,并为这个变量赋值

c) 如果不存在,会抛出一个异常或者创建一个变量(*详细请看下文LHS和 RHS)

备注:引擎去作用域查找变量的方式有两种一种是LHS查询,另外一种是RHS查询。

a) LHS可以认为是代表取得变量的源地址(变量实际上就是计算机内存中一段连续 的地址,并且我们通过为变量命名来为这段内存地址命名),取得源地址用于为该变量赋值。

b) RHS代表查询得到变量的值,一般用于为其他变量赋值

直接说LHS和RHS肯定太抽象,也不好记,LHS 和 RHS 字面上区别在于 L 和 R,分别代表左(left)和右(right)

对于 a= b = 2 这行代码,代码首先为b赋值为2。然后呢?重点来了

1首先查询得到b的值

2把查询的得到的值赋给a

而这,恰好分别对应着RHS查询和LHS查询,首先对处于右边的b进行一次RHS(查询得到b的值),然后LHS查询找到a变量的源地址(为a赋值)。

函数的执行,比如foo(2),实际是对foo进行一次RHS,得到的值是函数类型的对象,然后去执行他时,还有一次(多个形参时就是多次)对形参的LHS

3 作用域嵌套

当一个块或函数嵌套在另外一个块或函数中时,就发生了作用域的嵌套,因此,如果我们在一个块中定义函数的话,函数执行过程中是可以调用到函数外层的变量的。

整个的函数作用域链就像一个金字塔,在书中作者把函数作用域链比喻为一个建筑。在作用域的最顶层是一个全局作用域,每一个作用域都可能包含数个子作用域,如此往下延伸,因此金字塔对函数作用域链会更贴切。

LHS和RHS都会先在当前作用域进行查找,如果没有找到结果,那么它们都会一直往上寻找,直至全局作用域。

4 异常

如果引擎在最顶层的全局作用域中也找不到,那么会有什么行为呢? 在这里的话,LHS和RHS会有不同的行为

a.对于LHS:如果在最顶层也找不到这个变量,如果在非严格模式下,那么会在全局 作用域创建一个全局变量,如果处于严格模式下,严格模式禁止自动或隐式创建全 局变量,此时会抛出ReferenceError异常

b.对于RHS:如果在最顶层也找不到这个变量,那么会抛出ReferenceError异常。如果对查询的变量进行不合理的操作,比如调用非函数对象,会抛出TypeError异常。

你不知道的Javascript(上卷)读书笔记之一 ---- 作用域的更多相关文章

  1. JavaScript词法作用域—你不知道的JavaScript上卷读书笔记(一)

    前段时间在每天往返的地铁上抽空将 <你不知道的JavaScript(上卷)>读了一遍,这本书很多部分写的很是精妙,对于接触前端时间不太久的人来说,就好像是叩开了JavaScript的另一扇 ...

  2. JS闭包—你不知道的JavaScript上卷读书笔记(二)

    关于闭包,初学者会被绕的晕头转向,在学习的路上也付出了很多精力来理解. 让我们一起来揭开闭包神秘的面纱. 闭包晦涩的定义 看过很多关于闭包的定义,很多讲的云里雾里,晦涩难懂.让不少人以为闭包是多么玄乎 ...

  3. 你不知道的javascript 上卷 读书笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JavaScript中的this—你不知道的JavaScript上卷读书笔记(三)

    this是什么? this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件.this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式.当一个函数被调用时,会 ...

  5. JavaScript中的对象与原型—你不知道的JavaScript上卷读书笔记(四)

    一.对象 对象可以通过两种形式定义:声明(文字)形式和构造形式.即: var myObj = { key: value // ... }; 或: var myObj = new Object(); m ...

  6. 《你不知道的javascript》读书笔记2

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...

  7. 读《你不知道的JavaScript(上卷)》后感-作用域闭包(二)

    github原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们, ...

  8. 《你不知道的JavaScript》读书笔记(二)词法作用域

    JavaScript 采用的是 词法作用域 的工作模型. 定义 词法化:大部分标准语言编译器的第一个工作阶段叫词法化(单词化),这个过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词 ...

  9. 《你不知道的javascript》读书笔记1

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. js的工作原理 引擎:从头到尾负责整个js的编译和运行.(很大一部 ...

  10. 《你不知道的JavaScript》读书笔记(一)作用域

    名词 引擎:从头到尾负责整个 JavaScript 程序的 编译 及 执行 过程. 编译器:负责 语法分析 及 代码生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套 ...

随机推荐

  1. CSS3橙色的星球绕轨道公转动画

    效果:http://hovertree.com/texiao/css3/24/ 效果图: 代码如下: <!DOCTYPE html> <html lang="zh" ...

  2. IOS开发的基础知识

    1.为什么对一个变量release后还要设为nil 对一个变量release后,这个变量指向的内存释放了,但这个变量本身没变,仍指向原来的内存地址.若这个变量在释放后被访问,或者被重复release, ...

  3. PHP5各个版本的新功能和新特性总结

    因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录:PHP5.2 以前:auto ...

  4. 【C#公共帮助类】枚举独特类

    这个是枚举类,可能大家根据个人需求不同,不是很需要,但是跟着做那个项目的朋友会用到 我在这贴一下代码 using System; using System.Collections.Generic; u ...

  5. 一台主机上安装多个Tomcat

    1. 下载解压版的Tomcat,并解压两次,分别命名为Tomcat_Server_01和Tomcat_Server_02: 2. 进入Tomcat_Server_01\bin目录,编辑service文 ...

  6. IDE有毒

    程序员按项目性质大致有三种:写Demo的.写Proto的.写成品的:按项目开发周期大致有:写开头的.写中间的.写结尾的. Demo是样品,主要是表面上初步实现,临时忽悠客户用的,不一定要求继续演化: ...

  7. GTD工具 Wunderlist使用心得总结

    前言: 先后使用过do.it.omnifocus,最后选择了wunderlist,看了他拓展性强.跨平台.免费三大优点.Wunderlist只是一个工具,重要是的GTD的思路.下面的分享是本人的使用案 ...

  8. big-endian和little-endian

    1.故事的起源 "endian"这个词出自<格列佛游记>.小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开 ...

  9. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  10. Atitit.atiagent  agent分销系统 代理系统 设计文档

    Atitit.atiagent  agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...