浏览器组成:
- shell部分:所有能看到的部分
- 内核部分
-渲染引擎(HTML、CSS、JS的语法识别和渲染)
-js引擎:负责执行JS
-其他模块
2008年Google发布浏览器Chrome,采用优化后的JavaScript引擎,引擎代号V8,可以把js代码直接转化为机械码来执行,速度很快。
语言分类
- 编译型语言:通篇翻译后生成一个文件(比如c++的.obj文件),操作系统执行这个文件,比如c、c++
- 解释型语言:翻译一行执行一行,可以跨平台使用比如JavaScript、PHP、python
编译性语言更快,因此可以开发操作系统等底层语言;缺点是移植性不好,不跨平台。
服务器一般都是Unix和Linux,因为这两个操作系统安全性高
java既不是解释型语言也不是编译型语言,因为java先编译成.class文件,然后这个文件通过java虚拟机解释执行,因此也可以跨平台。
JavaScript:
- 解释型语言
- 单线程引擎
- ECMA标准(es6等)
执行到标签是异步,js引擎继续执行下一行且同时下载标签链接的文件。
执行JS的三个步骤:
- 通篇扫描:查找语法错误
- 预编译:函数声明整体提升,变量声明只有声明提升
var a=1;
//变量提升
var a;
a = 1;
(1)暗示全局变量:若变量未经声明就赋值,则该变量为全局变量(window)
a = 10;
//相当于
window.a = 10;
(2)一切声明的全局变量,都是window的属性
var b = 1;
//相当于
window.b = 1;
//相当于给window加属性
window {
b: 1
}
window就是全局的域
function text() {
var a = b =123;
}
//赋值过程为
//从右向左123赋值给b,而此时b未声明,因此b为全局变量
window.b -输出123
//然后从左向右声明var a,然后将b的值赋给a,因此a为局部变量
window.a -输出undefined
(3)预编译四步
例子:
function fn(a) {
console.log(a);
var a = 123;
console.log(a);
function a() {}
console.log(a);
var b = function() {}
console.log(b);
function d() {}
}
fn(1)
a. 创建AO对象(执行期上下文):由于函数执行而产生的存储空间库
AO {
}
b. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined(函数d是函数体,而不是变量,var b是变量)
AO {
a: undefined
b: undefined
}
c. 将实参值和形参统一
AO {
a: 1
b: undefined
}
d. 在函数体里面找到函数声明,值赋予函数体,变量提升在这个过程中的体现为,函数的声明全体被提升到最顶部,相当于原来函数体的地方现在是空的。
var b = function() {}在第二部变量提升后,最后原来的地方只剩下变量赋值:b = function() {}
AO {
a: function a() {}
b: function b() {}
function d() {}
}
所有的变量声明和一类变量声明被提升,变量赋值和函数赋值均留在原位
输出:
function a() {}
123
123
function b() {}
- 解释一行执行一行