Open YBFACC opened 4 years ago
注意⚠️ 变量提升不适用于 let 、const。一般提及都是var、function。
提起 变量提升 就要提起 预编译。分为以下4步:
变量提升
预编译
if (false) { var a = 'ybf' } console.log(a)//undefined
var a function a() {} console.log(a)//function...
function a(a1, b1) { function a1() {} console.log(a1) } a('a传参', 'b传参')//function a1() { … }
function name() { var a = b = 'ybf' } name() // console.log(a)//is not defined console.log(b)//"ybf"
b 会直接挂载到全局变量上。
function a(a1, b1) { console.log(a1)//function var a1 = 'var' console.log(a1)//var function a1() {} console.log(a1)//var } a('a传参', 'b传参')
可以看到形参直接没有出现,我们可以从预编译的过程中找到答案。
函数声明在最后声明,覆盖了形参。
a1的赋值,覆盖了函数。
函数声明优先级会高于值声明。
变量提升忽略 块级作用域
如果一个值没有声明就使用,不会变量提升。但是当执行时,会直接挂载到全局环境上。
变量提升
注意⚠️ 变量提升不适用于 let 、const。一般提及都是var、function。
提起
变量提升
就要提起预编译
。分为以下4步:具体测试
变量提升忽略块级作用域
函数声明优先级会高于值声明
参数与函数重名
使用未声明的变量
b 会直接挂载到全局变量上。
函数、形参、var声明重名
可以看到形参直接没有出现,我们可以从预编译的过程中找到答案。
函数声明在最后声明,覆盖了形参。
a1的赋值,覆盖了函数。
总结
函数声明优先级会高于值声明。
变量提升忽略 块级作用域
如果一个值没有声明就使用,不会变量提升。但是当执行时,会直接挂载到全局环境上。