《你不知道的JavaScript》-- 精读(一)
知识点
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》-- 精读(一)相关推荐
- 精读《你不知道的javascript》中卷
前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书< ...
- 精读《你不知道的 javascript(上卷)》
前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书介绍了该 ...
- 你不知道的javascript(上卷)----读书笔记
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>你不知 ...
- JS闭包—你不知道的JavaScript上卷读书笔记(二)
关于闭包,初学者会被绕的晕头转向,在学习的路上也付出了很多精力来理解. 让我们一起来揭开闭包神秘的面纱. 闭包晦涩的定义 看过很多关于闭包的定义,很多讲的云里雾里,晦涩难懂.让不少人以为闭包是多么玄乎 ...
- 你不知道的javascript读书笔记3
概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...
- 读书笔记-你不知道的JavaScript(上)
本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...
- 十分钟快速了解《你不知道的 JavaScript》(上卷)
最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...
- JavaScript提升(你不知道的JavaScript)
最近,在读<你不知道的JavaScript(上卷)>这本书,书中详细阐述了JavaScript众多重要但经常被大家忽略的点,在此强烈推荐!!!书中,第4章讲述了"提升" ...
- 你不知道的JavaScript 上卷 Part1
这篇博客躺在我的草稿箱里有一阵子了,差点给遗忘了哈哈. 前言 最近开始喜欢读一些书,从书中找答案,在阅读中查漏补缺. 记得小学初中时候最爱看书了,如今却不知怎的,习惯性从网络中摄取知识,搜 ...
- 你不知道的javascript上卷
你不知道的javascript上卷 作用域 javascript是一门编译语言,它不是提前编译的,编译结果也不能在分布式系统中移植.编译的步骤一般如下: 分词/词法分析 词法分析是有状态的判断一个分词 ...
最新文章
- 向iOS越狱彻底说再见!
- MATLAB中K-means函数表达方式
- mysql transaction用法,mysql的事务,隔离级别和锁用法实例分析
- linux中循环控制语句,3.2.3 Shell脚本--循环控制语句
- shell 和 || 的短路使用
- phison主控ps3111量产工具_从固态硬盘拆解看门道 深入解读闪存编号和主控容量...
- 学位论文盲审被卡,或直接被毙,问题主要出在这几条!
- FPGA异步时钟域处理之格雷码转换
- java做类似于qq空间动态加载_实现类似微博、QQ空间等的动态加载
- Jmeter入门6 参数化—CSV Data Set Config 通过文件导入数据
- 迭代器模式在 Java 容器中的实现
- javascript动画效果之多物体透明度
- php PDO连接mysql
- 京东到家开放平台网关系统设计实践
- html调用一言api,一言-纯净API
- 常用命令整理一(git、adb、vim、cmd、sh)
- JDBC连接Mysql并统计指定关键词在某一列中出现的次数
- 64位Windows7系统中Svchost占用内存跟CPU过高的问题解决办法
- 如何用ps做故障艺术风格效果
- 【甄选靶场】Vulnhub百个项目渗透——项目五十二:Fowsniff-1(任务挟持)
热门文章
- vb.net 同时给多个属性赋值_一个float值赋值给double,结果是什么?进来重温一下类型提升吧...
- php ajax 懒加载demo,lazyload懒加载,怎么支持ajax获得的新内容?
- CSS基础——浮动(float)【学习笔记】
- python+selenium自动化driver.switch_to.frame用法
- qt读oracle时间戳,QT解析时间戳与微秒级精度
- mysql连接量设置_mysql连接数设置操作方法(Too many connections)
- mysql 5乱码_MySQL 5.x乱码问题解决
- 调用 oauth2_奥利给,再也不怕面试官问我OAuth 2.0授权了
- 归一化函数mapminmax的讨论
- 软件模拟PWM——呼吸灯小程序的理解