我是靠谱客的博主 悲凉手套,最近开发中收集的这篇文章主要介绍JS预编译过程详解JS预编译,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JS预编译

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

  • 前奏

  1. 一切声明的全局变量都是window的属性;
    eg
var num = 1;
console.log(window.num); // --> 1;
  1. imply global 暗示全局变量 : 任何一个变量未经声明就赋值,此变量为全局对象所有 ——> 即为window的属性;
    eg:
function test() {
var a = b = 1;
console.log(a, b);
}
test(); // --> 1 1;
console.log(b); //--> 1;未经声明就赋值,就成为全局变量 打印 1
console.log(a); //--> 报错; a是全局没有,只在test内,作用域问题,下节将;
  • 函数预编译过程

  1. 创建一个AO对象 --> AO:执行期上下文 Activation Object
  2. 找形参和变量声明,将变量名和形参名作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
  3. 将形参和实参统一(将实参值赋给AO中与形参相同的属性);
  4. 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
    eg
function test(a, b){
var b = 10;
function a(){
console.log(a);
}
console.log(a, b);
}
test(1, 2);
/*
预编译过程
1. 创建一个AO对象
==>
AO = {};
2. 找形参和变量声明
==>
AO = {
a : undefined,
b : undefined
}
3. 将形参和实参统一
==>
AO = {
a : 1,
b : 2
}
4. 找函数声明,赋值为函数体
==>
AO = {
a : function a(){
console.log(a);
},
b : 2
}
*/
//当预编译执行完:AO为第四步的AO 此时执行函数内部语句:b = 10; ==>
AO{
//
a : function a(){
//
console.log(a);
//
},
//
b : 10	
//
}
//a的函数声明在预编译时执行过了
不看
//执行console.log(a, b) ==>
function(){} 10
ps:js函数执行时查找变量的值都在自己的AO(Activation Object)中找如果没有会去GO(Global Object 下面讲)中找.
  • 全局预编译过程

  1. 创建一个GO对象 --> Global Object
  2. 找变量声明作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
  3. 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
ps : GO === window

AO GO关系:AO里没有去GO找,
GO没有那就没有了;

最后

以上就是悲凉手套为你收集整理的JS预编译过程详解JS预编译的全部内容,希望文章能够帮你解决JS预编译过程详解JS预编译所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部