作用域3—JS学习笔记2015-6-11(第55天)

本文详细解析JS代码预解析过程,包括关键字的作用、重名处理规则及表达式对预解析值的影响,并通过实例展示如何正确理解和利用这一机制避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习作用域,彻底的理解js的运行机制;

首先在js代码运行之前,会进行预解析,至少会进行2步:

1、找一些东西——> var、function、参数等关键字,在js运行之前会给他们一些相应的动作

          比如变量会赋值 undefined;函数的内容就整个函数块;

                            如果遇到重名的情况下,留下函数,变量剔除;如果函数名也相同,则按照顺序

          留下后面的函数;

2、逐行读取代码;

 

比如下面的代码,如果不理解这种机制,我就认为第一个弹出的alert里面的值是 undefined;

然而实际上第一个是 function a(){ alert(5);} 这样一个函数块本身,最终留下的是alert(4)的

这个函数;

alert(a);
var a = 1;
alert(a);
function a(){ alert(2);}
alert(a);
var a = 3;
alert(a);
function a(){ alert(5);}
alert(a);

表达式可以修改预解析的值,所以原来预解析里面的a = function a(){alert(5)} 就变成了 a=1;

当js代码逐行运行到 var a = 1 的时候;

因为表达式修改了预解析的值,所以后面的a();就会报错,为什么会报错?因为此时的预解析仓库里

已经没有函数了,原先的a 已经被赋值为3了;

alert(a);      //   function a(){ alert(5);}
var a = 1;
alert(a);      //  1
function a(){ alert(2);}
alert(a);    //    1
var a = 3;
alert(a);     //   3
function a(){ alert(5);}
alert(a);     //   3
a();   //   报错   TypeError: a is not a function

 

 

  

转载于:https://www.cnblogs.com/zhangxg/p/4570547.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值