开篇提示:此文章来自自己学习JavaScript的笔记,为日后方便巩固知识所做的笔记,因为初学,若笔记中有问题,望海涵,多多指教。
截图来自: W3school中的JS教程
笔记来自:你不知道的JavaScript(上卷)
关于引擎,编译器,作用域
引擎:从头到尾负责整个JavaScript程序的编译及执行过程
编译器:负责语法分析及代码生成等脏累活
作用域:负责收集并维护由所有声明的标识符(变量)组成的一些列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
关于作用域
1.块作用域(block scope)
在块作用域中,有两个关键词,let和const可以用来声明块作用域
注意:通过var声明的变量没有块作用域
截图来自: W3school中的JS教程
注意:若在块作用域中用var重新声明变量,块作用域外的变量也将改变变量!
解决办法:可以使用let来重新声明变量,let重新声明变量不会影响块作用域外的变量。
JavaScript 函数优先
我们习惯将var a = 2 ;看作一个声明,
而实际上JavaScript引擎不这么认为,它会分为var a 和 a = 2 两段声明。
第一段var a是编译阶段,第二段a = 2是执行阶段。
每个作用域都会进行提升。
函数声明和变量声明都会被提升,提升顺序为函数>变量,函数先提升然后再到变量提升。
提升可以被覆盖,若函数的声明和变量的声明重复了,函数的声明会覆盖变量的声明。
若函数与函数的声明重复了,后者将覆盖前者。
JavaScript 变量提升
JavaScript声明提升
函数及变量的声明都将被提升到函数的对顶部
变量可以在使用后声明,也就是变脸高可用先使用在声明。
JavaScript 初始化不会提升
JavaScript只有声明的变量会提升,初始化不会。
JavaScirpt执行环境
执行环境有: 全局环境
函数环境
JavaScript的执行是单线程,所以一次只能做一件事,也就是"栈" Stack
作用域链
此处截图来自bilibili 技术蛋老师B站技术蛋老师
JavaScript编译器 提升
变量和函数在内的所有声明都会在任何代码被执行前首先被处理。
eg:
var a = 2;
看上去是声明,但在 编译器看来,实际上是 两个声明, var a 和 a = 2 。
第一个 var a 定义声明是在 编译阶段
var a;
a = 2;
console.log( a );
第二个 a = 2赋值声明会被留在原地 等待执行阶段
var a ;
console.log( a );
a = 2;
因此这个过程就好像变量和函数声明从它们在代码中出现的位置被 "移动"了到最上面,
这个过程叫 “提升”。
只有声明本身会被提升,而赋值或其他运行逻辑会留在原地等待执行。
图来自W3school
立即执行函数表达式
eg:
var a = 2 ;
( function foo(){
var a = 3;
console.log(a) 3
} )();
console.log(a); 2
由于函数被包含在一对括号()里,因此成为的表达式,通过在末尾在加上一个括号()可以立即执行这个函数。