脚本宝典收集整理的这篇文章主要介绍了JS预编译,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
参考 来源:https://www.bilibili.com/video/BV1sN411974w?p=2 细讲: https://zhuanlan.zhihu.com/p/50236805 https://developer.mozilla.org/zh-CN/docs/Glossary/Scope
语法分析-预编译-逐行执行
任何变量,如果变量未经声明就赋值,这些变量就为全局对象所有。一切声明的全局变量和未经声明的变量,全归window所有。 例如:
// 1
var a = 123;
window.a = 123;
// 2
function test(){
// 这里的b是未经声明的变量,所以是归window所有的。
var a = b = 110;
}
当前的执行上下文。值 (en-US)和表达式在其中 "可见" 或可被访问到的上下文。如果一个变量 (en-US)或者其他表达式不 "在当前的作用域中",那么它就是不可用的。 作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。 当然,一个 Function 将生成一个闭包(通常是返回一个函数引用),这个函数引用从外部作用域(在当前环境下)可以访问闭包内部的作用域。
先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行:
GO对象是全局预编译,所以它优先于AO对象所创建和执行
<script>
中的变量和函数,作用域为全局// 函数
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=66 // 不执行
}
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.预编译第1步:创建AO对象
AO{
}
2.预编译第2步:找形参和变量声明,将形参名和变量名作为AO对象的属性名
AO{
a : undefined,
c : undefined,
d : undefined,
b : undefined
}
3.预编译第3步:将实参值和形参统一
AO{
a : 1,
c : 2,
d : undefined,
b : undefined
}
4.预编译第4步:在函数体里面找函数声明,值赋予函数体。
AO{
a : function a(){...},
c : function c(){...},
d : undefined,
b : undefined
}
5.解释执行见题目注释
function a(){}
123
function c(){}
undefined
undefined
function(){}
function c(){}
以上是脚本宝典为你收集整理的JS预编译全部内容,希望文章能够帮你解决JS预编译所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。