知识点

1.编译原理

程序中的一段源代码在执行之前会经历三个步骤:分词/词法分析,解析/语法分析,代码生成,统称为“编译”。

简单说,就是有某种方法可以将var a = 2;的AST转化为一组机器指令,用来创建一个叫做a的变量(包括分配内存等),并将一个值储存在a中。

2.理解作用域

  • 引擎:从头到尾负责整个JavaScript程序的编译及执行过程
  • 编译器:负责语法分析及代码生成等
  • 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

总结:变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。

3.LHS和RHS

引擎在作用域协助下的查询变量操作

查找并取值是RHS

console.log(a)
复制代码

查找并赋值是LHS

a = 2;
复制代码

4.小测验

function foo(a){  // a = 2var b = a;   // b =  , = areturn a + b;  // a   ,b
}
var c = foo(2)  // c = ...  , foo(2)
// LHS 3处
// RHS 4处
复制代码

作用域嵌套

function foo(a){console.log(a+b);
}
var b = 2;
foo(2) // 4
复制代码

引擎从当前的执行作用域开始查找变量,如果找不到,就向上一级继续查找。当抵达最外层全局作用域时,无论找到还是没找到,查找过程都会停止。

总结

1.作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用LHS查询,如果目的是获取变量的值,就会使用RHS查询。

2.JavaScript引擎首先会在代码执行前对其进行编译,在这个过程中,像var a = 2这样的声明会被分解成两个独立的步骤:

  • var a 在其作用域中声明新变量
  • a = 2会查询(LHS查询)变量a并对其赋值。

3.不成功的RHS引用会导致抛出ReferenceError异常。不成功的LHS引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用LHS引用的目标作为标识符,或者抛出ReferenceError异常(严格模式下)

思考

JavaScript引擎是如何区分var a; a的变量类型的?

扩展

编程语言通常会分为汇编语言,机器语言,脚本语言,高级语言四类。而高级语言又会分为解释类语言和编译类语言,通常会将JavaScript归类为解释类语言,但是事实上,它是一门编译类语言,只是与传统的编译语言不同,它会在程序运行前的几微秒内进行编译,并且不会生成字节码文件。

JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。 市面上主要的JavaScript引擎有Chrome浏览器的V8引擎,Mozilla Firefox的Gecko排版引擎,SpiderMonkey和Rhino,以及Opera等。

巴拉巴拉

晚上睡不好的危害:

1.第二天会懵逼,脑子不够用,

2.第二天会暴饮暴食

3.第二天会情绪不在线,易怒

4.最恐怖的是平常可以消化或者没消化完的情绪会反噬,说话会没思考,后悔的次数也变多,会更纠结

解决方法:

1.早睡

2.失眠尝试简单的催眠方法,减轻睡不着的心理负担

3.很多时候,不去担心第二天的事情都不会失眠的,所以在发生晚上睡不好的第二天,也没什么,相信自己的自我调节能力,时刻保持不失控的状态。

转载于:https://juejin.im/post/5d02529ae51d45572c060034

《你不知道的JavaScript》-- 精读(一)相关推荐

  1. 精读《你不知道的javascript》中卷

    前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书< ...

  2. 精读《你不知道的 javascript(上卷)》

    前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书介绍了该 ...

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

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>你不知 ...

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

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

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

    概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...

  6. 读书笔记-你不知道的JavaScript(上)

    本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...

  7. 十分钟快速了解《你不知道的 JavaScript》(上卷)

    最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...

  8. JavaScript提升(你不知道的JavaScript)

    最近,在读<你不知道的JavaScript(上卷)>这本书,书中详细阐述了JavaScript众多重要但经常被大家忽略的点,在此强烈推荐!!!书中,第4章讲述了"提升" ...

  9. 你不知道的JavaScript 上卷 Part1

      这篇博客躺在我的草稿箱里有一阵子了,差点给遗忘了哈哈. 前言   最近开始喜欢读一些书,从书中找答案,在阅读中查漏补缺.   记得小学初中时候最爱看书了,如今却不知怎的,习惯性从网络中摄取知识,搜 ...

  10. 你不知道的javascript上卷

    你不知道的javascript上卷 作用域 javascript是一门编译语言,它不是提前编译的,编译结果也不能在分布式系统中移植.编译的步骤一般如下: 分词/词法分析 词法分析是有状态的判断一个分词 ...

最新文章

  1. 向iOS越狱彻底说再见!
  2. MATLAB中K-means函数表达方式
  3. mysql transaction用法,mysql的事务,隔离级别和锁用法实例分析
  4. linux中循环控制语句,3.2.3 Shell脚本--循环控制语句
  5. shell 和 || 的短路使用
  6. phison主控ps3111量产工具_从固态硬盘拆解看门道 深入解读闪存编号和主控容量...
  7. 学位论文盲审被卡,或直接被毙,问题主要出在这几条!
  8. FPGA异步时钟域处理之格雷码转换
  9. java做类似于qq空间动态加载_实现类似微博、QQ空间等的动态加载
  10. Jmeter入门6 参数化—CSV Data Set Config 通过文件导入数据
  11. 迭代器模式在 Java 容器中的实现
  12. javascript动画效果之多物体透明度
  13. php PDO连接mysql
  14. 京东到家开放平台网关系统设计实践
  15. html调用一言api,一言-纯净API
  16. 常用命令整理一(git、adb、vim、cmd、sh)
  17. JDBC连接Mysql并统计指定关键词在某一列中出现的次数
  18. 64位Windows7系统中Svchost占用内存跟CPU过高的问题解决办法
  19. 如何用ps做故障艺术风格效果
  20. 【甄选靶场】Vulnhub百个项目渗透——项目五十二:Fowsniff-1(任务挟持)

热门文章

  1. vb.net 同时给多个属性赋值_一个float值赋值给double,结果是什么?进来重温一下类型提升吧...
  2. php ajax 懒加载demo,lazyload懒加载,怎么支持ajax获得的新内容?
  3. CSS基础——浮动(float)【学习笔记】
  4. python+selenium自动化driver.switch_to.frame用法
  5. qt读oracle时间戳,QT解析时间戳与微秒级精度
  6. mysql连接量设置_mysql连接数设置操作方法(Too many connections)
  7. mysql 5乱码_MySQL 5.x乱码问题解决
  8. 调用 oauth2_奥利给,再也不怕面试官问我OAuth 2.0授权了
  9. 归一化函数mapminmax的讨论
  10. 软件模拟PWM——呼吸灯小程序的理解