我是靠谱客的博主 彩色白羊,最近开发中收集的这篇文章主要介绍预编译与函数作用域,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

什么是预编译:

预编译又称为预处理,是做些代码文本的替换工作。是整个编译过程的最先做的工作。

预编译发生在函数执行的前一刻

JS预编译步骤:

1. 创建AO对象(Activation Object 执行期上下文)
2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined,无论是否有if条件
3. 将实参值和形参值统一
4. 在函数体里面找函数声明,值赋予函数体
(预编译时已经进行了变量提升,最后的结果就是函数执行时变量最后的赋值)

举个栗子:

function test(a, b) {
console.log(a);
// f a() {}
/*
*其实这里很多人都不明白为什么时f a() {}而不是undefined,
*因为前面在活动对象里已经创建了属性a,函数执行的前预编译进行的最后一步是把内部声明的函数赋值给自身,
*这里的function a()就要赋值给a,所以覆盖了a之前的值。此时执行test,里面的a就是function
*/
console.log(b);
// undefined
var b = 234;
console.log(b);
//234
a = 123;
console.log(a);
//123
function a() {}
var a;
b = 234;
var b = function () {}
console.log(a);
//123
console.log(b);
//f () {}

}
test(1);
/*
*整个执行步骤原理就是 函数执行前会先进行预编译,系统会创建一个AO活动对象,
*然后存储所有声明的变量为对象属性,值为undefined,接着传入实参1,最后会把内部重复命名的函数,
*比如function a赋值给a,现在才进行函数的执行。然后函数内部的赋值才覆盖预编译里的值
*/

上面是函数体内的预编译,预编译也发生在全局

console.log(a); //function a() {}
var a = 123;
function a() {}
console.log(a); //12

全局变量提升,依然执行预编译,这里生成的不是AO而是GO (global Object);
未声明的变量属于全局变量

最后

以上就是彩色白羊为你收集整理的预编译与函数作用域的全部内容,希望文章能够帮你解决预编译与函数作用域所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部