变量名与函数名重复
今天遇到一道很有意思的题目
console.log(c); var c; function c(a) { console.log(a); var a = 3; function a() {} } c(2);
小伙伴们的答案是什么呢?
这就涉及到我们的函数和变量的预解析了
js‘从上到下运行’,但是可不是运行到哪才执行那一句语句。。
举个栗子:
(现在用let和const没这个问题,会直接报错)
console.log(a);
var a = 0;
输出undefined,而不是直接报错,为什么?
因为浏览器会预解析变量,也就是:
var a;
conso.log(a);
a = 0;
浏览器的预解析不止变量,还有函数声明
1)函数声明会置顶
2)变量声明也会置顶
3)函数声明比变量声明更置顶:(函数在变量上面)
4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明
注意:函数变量在下面重新赋值的话会覆盖掉函数声明(只声明就不会,栗子:var obj;)
function obj(){ console.log('函数声明') } var obj = 'test' obj() // 报错,obj is not a function
说了那么多废话,上面那个才是关键,函数声明的等级高于变量声明,所以上面那道题可以解释为:
function c(a) { function a() {} var a; console.log(a); a = 3; } var c; console.log(c); c(2);
好了,就这样....