通过变量和函数重名这一情况理解和分析二者的解析规则
一 解析规则
- 函数声明会置顶
- 变量声明会置顶
- 函数声明优先级高于变量声明,重名时函数是一等公民
- 变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值两个部分,声明置顶,赋值保留在原来位置(参考: 菜鸟教程:JavaScript 声明提升)
- 声明过的变量不会重复声明
二 根据解析规则测试几种情况
1 函数和变量重名下执行情况
foo();
var foo;
function foo(){
console.log(1);
}
foo = function(){
console.log(2);
}
foo()
//结果:1
函数和变量都会提升,但函数优先于变量,再次声明变量foo,因已存在不会重复声明,最上面的函数执行输出1,在重新赋值后,再次执行将输出2
2 立即执行函数情况
var a = 5;
var b = 10;
(function b(){
b = 20;
console.log(a);
console.log(b);
})();
//结果:5 funciton b
立即执行的函数名不允许修改,被认为是匿名自执行函数,非严格模式静默修改失败,严格模式("use strict"
)抛出"Uncaught TypeError: Assignment to constant variable."
错误