JS 函数声明与变量声明的"坑"

img

函数声明与变量声明到底谁是优先?

同时声明一个标识符a,一个是变量声明,一个是函数声明,

1
2
3
4
5
6
7
var a;

console.log(typeof a); // => 'function'

function a() {

}

我们知道在JavaScript中存在Hoisting变量提升的概念,遇到以上实例的情况,我们首先得到一个答案,即:在编译词法分析阶段,优先对函数声明进行提升,然后才是变量,询问在同一个作用域的集合中是否存在变量a,有则忽略,没有则要求作用域中声明一个新的变量a,然后遇到var a时被忽略了。(不管如何移动上面的代码都不会影响结果)

在条件句内的”坑”

当我们想去用if语句来判断执行那个函数时

1
2
3
4
5
6
7
8
9
10
11
12
13
foo() // ie7 | ie8 => 'b' , Chrome/63.0报错 foo is not a function

var a = true

if (a) {
function foo() {
console.log('a')
}
} else {
function foo() {
console.log('b')
}
}

避免在块级内部声明函数。