理解js中的函数声明提升

143 阅读1分钟

前言:函数声明会被解释器优先提升到作用域顶部,并且优先于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为了应付八股文面试。日常谁这么写代码?