javascript是解释型语言,主要特点为解释一行执行一行
JS运行过程
- 语法分析:会在代码执行前对代码进行通篇检查,以排除一些低级错误
- 预编译:发生在代码执行(函数执行)的前一刻
- 解释执行:就是执行代码
预编译的作用:
1、函数声明整体提升
即写出一个函数声明,不管写在哪里,系统总会将其提升到逻辑最前面。
2、变量声明提升
document.write(a);
var a=123
//undefined
相当于是:
var a;//提升
document.write(a);
a=123;
//undefined
而直接进行打印输入的a话:console.log(a),浏览器会报错,表示a没有定义
预编译前奏
1、任何变量,如果变量未声明就赋值,此变量就为全局对象所有。
function test(){
var a=b=123;
}
test();
//因为b变量未经声明,所以当在全局访问a时,a为undefined,而b为123;
window.a //undefined
window.b //123
预编译四部曲
1、创建AO(Activatin object)对象
2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3、将实参和形参统一
4、在函数体里面找**函数声明**,值赋予函数体(注意此处的函数声明要区别于哈函数表达式)
例题
function fn(a, c) {
console.log(a); //function a(){}
var a = 123;
console.log(a); //123
console.log(c); //function c(){}
function a() {}
if (false) {
var d = 578;
}
console.log(d); //undefined
console.log(b); //undefined
var b = function() {}
console.log(b); //function(){}
function c() {}
console.log(c) //function c(){}
}
fn(1, 2)
// 预编译四部曲
// 1.创建AO对象
// AO{}
// 2.找形参和变量声明,将变量和形参名作为AO属性,值为undefined
// AO{a:undefined;c:undefined;d:undefined;b:undefined }
// 3.实参和形参相统一
// AO{a:undefined 1;c:undefined 2;d:undefined;b:undefined}
// 4.找函数声明 会覆盖变量的声明
// AO{a:undefined 1 function a(){};c:undefined 2 function c(){};d:undefined;b:undefined;function (){}}