[关闭]
@panhonhang 2018-08-13T09:57:41.000000Z 字数 950 阅读 453

预解析

JavaScript


首先来看什么是预解析:

在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。

话不多说,直接上题;

alert(a)
a();
var a=3;
function a(){
    alert(10)
}   
alert(a)
a=6;
a();  

上述代码会输出什么呢?

我们一步步来分析;首先变量声明和函数声明都会提升并且函数声明优于变量声明,所以说上面的代码等同于下面的:

function a(){
    alert(10)
}  
var a;
alert(a)
a();
a = 3;
alert(a)
a=6;
a();  

所以执行结果显而易见:

1.alert出来的是

function a(){
    alert(10)
}  

2.执行函数a(),结果alert出来的是10;

3.执行a = 3,所以alert出来的是3;

4.执行a = 6;所以下面执行函数a()会报错

“Uncaught TypeError: a is not a function”

也许有朋友会问了,为什么最后执行a()会报错不是一个函数了呢?

我们来捋一捋,重复一遍前面说过的话“在js中函数的声明 比变量优先级要高”,并且如果函数名与变量名相同的时候,函数的定义过程不会被变量覆盖除非是赋值。所以现在知道为什么最后a()不是一个函数了吧!因为前面对a执行了赋值操作,这直接导致了函数被变量覆盖,所以最后a()会报错 “Uncaught TypeError: a is not a function”。

那么如果不带var有什么区别呢?
在全局作用域中声明变量带var可以进行预解析,所以在赋值的前面执行不会报错;声明变量的时候不带var的时候,不能进行预解析,所以在赋值的前面执行会报错。

alert(a);
var a = 12;

alert(b);
b = 12;

上面两个执行的结果分别是:undefined 与 “Uncaught ReferenceError: b is not defined”

总结一下:

预解析就是在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。如果不带var不会预解析,函数声明优于变量声明,并且如果函数名与变量名相同的时候,函数的定义过程不会被变量覆盖除非是赋值

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注