变量提升

警告

关于 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
Last Updated:
Contributors: Vsnoy