@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不会预解析,函数声明优于变量声明,并且如果函数名与变量名相同的时候,函数的定义过程不会被变量覆盖除非是赋值。