JS--JS运行三部曲--渡一教育(视频笔记)

语法分析(通篇扫描一遍但不执行)

预编译

function test(){
   console.log(a);
}
test();


//上下两块代码都能执行并在控制台输出结果a


test();
function test(){
   console.log(a);
}
console.log(a);
var a = 123;  //控制台输出undefined
如果只有 console.log(a); 则会报错,a is not defined
---------------------------------------------
var a = 123;
console.log(a);  //控制台输出123

函数声明整体提升:函数不管写在那一部分,系统总是会把函数提到逻辑的最前面
变量 声明提升:var a = 123;---->var a; a = 123; 系统会将var a;这一部分提到程序的最前面

//会输出什么?
console.log(a); //输出function a(a) {......}
function a(a){
   console.log(a); //输出function a() {}
   var a = 234;
   console.log(a); //输出234
   function a() {}
}
a(1);
var a = 123;

预编译前奏

  1. imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量 就为全局对象(window)所有
    eg: a = 123;
    eg: var a = b = 123; ----> b = 123; -> var a; -> a = b;
  2. 一切声明的全局变量,全是window的属性;window就是全局的域
    eg: var a = 123; ---->window.a = 123;
     

预编译四步曲

1、创建AO对象(Activation Object)(执行期上下文:函数产生的存储空间库)
2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3、将实参值和形参统一
4、在函数体里面找函数声明,值赋予函数体

//不同地方的 console.log(a); 输出结果是什么?
function fn(a){
   console.log(a); //在AO里找值--->输出 function a() {}
   var a = 123; //预编译将 var a;提升上去了,执行 a = 123;修改AO中a的值
   console.log(a); //输出 123
   function a() {} //预编译读过,不再读
   console.log(a); //输出 123
   var b = function() {} //函数表达式,将AO中b的值改为function () {}
   console.log(b); //输出funtion () {}
   function d() {}
}
fn(1);

预编译发生在函数执行的前一刻;预编译也发生在全局,第一步为创建GO对象;
GO(Global Object) === window

第一步:AO{ }
第二步
AO{
a : undefined,
b : undefined
}
第三步
AO{
a : 1,
b : undefined
}
第四步
AO{
a : function a() {},
b : undefined,
d : function d() {}
}
 

解释执行

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值