javaScript变量提升与词法解释

到底什么是变量提升,我们先来看两段javascript代码
a='test';
var a;
console.log(a);
console.log(a);
var a='test';

那么这两段代码在控制台输出的是什么呢,它的输出结果分别是test和undefined。

这是为什么呢,那是因为javascript并不是一行一行的执行的。要运行javascript,要经历两个阶段

1.词法解释(预编译)
在这个阶段,会在整个文件之中查找带var的关键字,并把带var关键字的变量声明提到当前作用域的最前面,而赋值语句停留在当前位置。

2.运行阶段(代码从上往下执行)
所以按照此规律我们再去看看这两段代码,是不是就能够理解为什么第一段代码输出test而第二段代码输出的是undefined了。

变量声明会提前,那么函数呢。让我们来看下面两段代码
test();
function test()
{
	alert('test');
}
vtest();
var vtest=function test()
{
 alert('test');
}
我们可以看到,第一段是一个正常的函数声明,第二段是一个匿名函数,函数调用都在函数声明之前,然后我们来分别执行它们,最后得到的结果是第一段能弹出test窗口,第二段会爆 SCRIPT5007: Object expected的错误,这又是为什么呢。
正常声明的函数和var一样,也会在编译的时候向上提升到作用域的最前面,所以第一段代码能正常弹出警示框,而匿名函数则不可以,按照前面var的变量提升原则,它会变成这个样子
var vtest;
vtest();
vtest=function test()
{
 alert('test');
}
按这个样子来的话当然会报错: SCRIPT5007: Object expected。
最后我们来看一段变量提升的练习。
test();
function test()
{
	console.log(a);
	var a='test';
}

这段代码最后会被解释成这样:

function test()
{
        var a;
	console.log(a);
	a='test';
}
test();

最后运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值