前言:函数声明会被解释器优先提升到作用域顶部,并且优先于var声明,不会被var声明覆盖,但是会被赋值覆盖。在let声明变量下再次声明同名函数,会报错Identifier 'a' has already been declared,因为let的块作用域性质。
解释: 1。函数声明会被解释器优先提升到作用域顶部,并且优先于var声明:
var a
function a(){console.log(222)}
// a是一个函数声明
2.但是会被赋值覆盖
var a = 1
function a(){console.log(222)}
// a是值为1的变量标签
3.let声明变量下再次声明同名函数,会报错
let a = 1
function a(){console.log(222)}
// 报错
不太重要的补充:
if(condition){
function a(){console.log(1)}
}else{
function a(){console.log(2)}
}
//只能打印2,没什么可说的,函数声明被到顶部被赋值覆盖,想想对不对
if(condition){
let a = function (){console.log(1)}
}else{
let a = function (){console.log(2)}
}
//函数表达式很好的解决上述问题。
这个知识点总结结束,有什么用呢?就tm为了应付八股文面试。日常谁这么写代码?