老生长谈的JS预编译


下午看了JS引擎的运行过程,其中有个环节是预解析,这里面潜藏着许多在JS开发过程中遇到的麻烦的根源。

先奉上熟悉的代码:

alert(i)

var i=0;

执行结果,弹出undefined。为什么是这样呢,这里就来寻找根源,就是本文的中心思想,JS预解析。

在JS引擎解析的时候,看到var i=0这行就先把i预先声明了(意思就是再代码执行前的动作),但不会给它赋值就形如下面:

var i;

alert(i)

i=0;

这样看来就很理所应当了。这里还要提出的:

alert(a)

var a = function(){}

和刚才的那个一样的结果,只不过这个function可以作为变量使用。

除了var还有function也会预声明,这里有点特殊,是函数就不仅仅是声明了,而且还把匿名函数给了这个变量:

alert(a)

function() a{}

这里就不是undefined了而是function了。甚至可以直接执行:

a()

function a(){alert(1)}

因为在执行a()之前,预解析已经把一个function赋值给a了


这里就有个问题,当var a=1和function a(){}同时被预解析的时候,会最终执行function a(){}:

alert(typeof a)

var a = "x";

function a(){}

alert(typeof a)

function a(){}

var a = "x";


弹出的结果都是function



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值