变量提升
警告
关于 if 块内函数提升,各浏览器内部实现规则不一致,可能导致结果不同。
以下代码块中的输出结果均是基于 Chrome 下的,其他浏览器结果可能不一样。
例如习题组三的第一题,在 Chrome 下是输出这个结果,在 FireFox 下直接就报错了。
习题一
console.log(a)
console.log(a())
var a = 3
function a() {
console.log(10)
}
console.log(a)
a = 6
console.log(a())
// 输出
function a() { console.log(10) }
10
3
Uncaught TypeError: a is not a function
习题组一
习题一
console.log(a)
if (true) {
a = 1
function a() {}
a = 5
console.log(a)
}
console.log(a)
// 输出
undefined
5
1
习题二
console.log(a)
if (false) {
a = 1
function a() {}
a = 5
console.log(a)
}
console.log(a)
// 输出
undefined
undefined
习题组二
习题一
if (true) {
a = 3
function a() {}
console.log(a)
}
console.log(a)
// 输出
3
3
习题二
if (true) {
function a() {}
a = 3
console.log(a)
}
console.log(a)
// 输出
3
function a() {}
习题组三
习题一
var a
if(true) {
function f() {
f = a
}
}
f()
console.log(f)
// 输出
function f() { f = a }
// 难点
函数内部的 f,指代的是 if 块内部的函数变量,不是提升到外界的函数变量
因此外界 f 在作为函数 function f () { f = a } 执行的时候,f 修改的只是 if 块内部的函数变量 f,影响不到外界。
影响外界的函数变量赋值仅到函数声明语句前为止,再之后的函数变量赋值对外界没有影响。
// 警告
不同函数内部基于块内函数声明提升的内部实现不一致,该输出结果是基于 Chrome 背景下得出的,在 FireFox 下直接报错。
不用太在意,研究娱乐而已。
习题二
var a
if(true) {
f()
function f() {
f = a
}
}
console.log(f)
// 输出
undefined