if内部函数提升时内部数据和全局数据赋值问题
今天遇到一个关于if内部的函数提升的问题
百度了一下大概意思如下
从ES6开始
在严格模式下,块 里 的函数作用域为这个块。ES6之前不建议块级函数在严格模式下使用.
在ES6非严格模式下, 块中函数声明会出现提升, 所以最好使用函数表达式来定义函数
补充 :
声明式:function a(){}
表达式: var a = function(){}
个人理解就是使用声明式的话数据操作会出现一些小问题
请看如下代码:
console.log(a)
if (true) {
console.log(a)
a= 1
console.log(a)
function a() {}
a= 2
console.log(a)
}
console.log(a)
# 预期输出为:
undefind 函数a 1 2 2
# 实际输出为:
undefind 函数a 1 2 1
分析
先将内部函数声明注掉:
console.log(a) // undefinded
if (true) {
console.log(a)
a = 1
console.log(a)
// function a() {}
a= 2
console.log(a)
}
console.log(a)
#打印结果为:
ReferenceError temp is not defined
说明if内部确实存在变量提升
断点测试
赋值为1之前:
可以发现 if 已经完成了变量提升,if作用域内部的 a 为函数a
而全局的a仍然为undefined
赋值为1之后:
if作用域内部的 a 变成了1
而全局的a仍然是undefined
运行 function a(){}之后
if内部的a = 1 赋值给了全局的a,此时都为 1
if内部赋值为2时
此时发现再进行赋值的话也只是对if的块级作用域内部进行修改,不会再去修改全局的a
说明if内部将1赋值给了全局的a,但是在内部函数声明之后再对全局数据的修改将不能实现,只能完成对当前块级作用域的同名变量完成修改如果想解决这个问题可以使用表达式来声明函数,使用表达式可以将函数看作一个变量
var a
console.log(a)
if (true) {
console.log(a)
a = 1
console.log(a)
a= function() {}
a = 2
console.log(a)
}
console.log(a)
# 输出为:
undefind undefind 1 2 2