/* js运行时会进行三件事:1语法分析 2.预编译 3.解释执行 */
/* 1.语法分析:浏览器对Js全篇预览,判断语法是否失误 */
/* 2.预编译的四部曲:
1.创建GO/AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
*/
/* ------------JS中函数-------------- */
function name(a) {
console.log(a);
var a = 123;
console.log(a)
function a() { }
console.log(a);
var b = function () { }
console.log(b);
}
name(1);
/* --------浏览器预编译解析机制--------- */
/* 1.创建GO/AO对象 */
AO = {}
/* 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined */
AO = {
a: undefined,
b: undefined
/* 因为形参中有a已放入AO对象,所以变量声明的a不放入AO对象 */
}
/* 3.将实参值和形参统一 */
AO = {
a: 1,
b: undefined
/* 实参是1,所以形参也是1 */
}
/* 4.在函数体里面找函数声明,值赋予函数体 */
AO = {
a: function a() { },
b: undefined,
/*因为函数体中有a函数,所以AO对象的a属性值发生改变 */
}
/* 到这里浏览器解析预编译结束,存储的内存AO对象如上例4 */
/* 3.解释执行 =>开始执行js中函数,函数打印如下 */
// function a() {}
// 123
// 123
// function b() {}
/*解析: 因为js从上往下执行,函数执行过程中,函数内部中第一行读取打印的a变量是AO对象中/浏览器内存中(这里已经发生了变量提升)的属性a,所以打印function a(){}的函数体,然后声明变量a对内存中属性a重新赋值,第3行打印123,14行创建的函数a已经在预编译过程中提升赋值使用,这里Js解释执行不再使用,所以第5行还是打印123,第6行声明的变量b函数体对AO对象存储重新赋值,所以第7行打印b得到function b(){}的函数体
*/
这里奉上渡一课堂成哥的视频地址:https://ke.qq.com/course/231577#term_id=100273169