js预解析以及案例里的坑

js预解析

js作为一门解释型脚本语言,特点是边解析边执行。而预解析则是,提前解析的意思,也就是所说的变量提升。

console.log(a);
var a = 10;//undefined
复制代码

这里的结果是undefined而并不是a is not defined。是因为var a被提升到console.log之前,即

var a;
console.log(a);
var a = 10;//undefined
复制代码

但是函数提升则不是undefined的结果,而是结果正常。

function foo(){
	console.log('aaa');
};
foo();//aaa
复制代码

VS

foo();//aaa
function foo(){
	console.log('aaa');
};
复制代码

案例里的坑

一个闹心的例子
foo();//20
var number =20;
function foo(){
    console.log(number);
}
复制代码

函数的例子
foo();//undefined
var number =20;
function foo(){
    console.log(number);
    var number = 10;
}
复制代码

函数提升了,函数中的变量number也被提升了,结果就成了undefined

隐藏的隐式全局变量

以下刚开始,我的答案是9 9 9 报错 报错 报错,后来才发现里面有坑。

foo();
console.log(c);//9
console.log(b);//9
console.log(a);//报错 a is not defined
function foo(){
	var a=b=c=9;
	console.log(a);//9
	console.log(b);//9
	console.log(c);//9
}
复制代码

以上相当于

function foo(){
	var a;
        c = 9;
        b = c;
        a = b;
	console.log(a);//9
	console.log(b);//9
	console.log(c);//9
}
foo();
console.log(c);//9
console.log(b);//9
console.log(a);//报错 a is not defined
复制代码

因为b跟c都是用隐式全局变量,所以答案是9,而a是用var声明的局部变量,在函数以外访问,会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值