函数声明与函数表达式
疑问1:
var aa = function () {
console.log(2)
}
function aa() {
console.log(1)
}
aa() //2
function aa() {
console.log(1)
}
var aa = function () {
console.log(2)
}
aa() //2
疑问2:
function aa() {
console.log(1)
}
var bb=aa;
aa = function(){
console.log(2)
};
aa() //2
bb() //1
function aa() {
console.log(1)
}
var bb=aa;
function aa() {
console.log(2)
}
aa() //2
bb() //2
找的一个解释,但是依旧存疑。他这说法不太靠谱
函数的声明比变量的声明的优先级要高
1 function text6() {
2 function a() {}
3 var a;
4 log(a); //打印出a的函数体
5
6 var b;
7 function b() {}
8 log(b); //打印出b的函数体
9
10 // !注意看,一旦变量被赋值后,将会输出变量
11 var c = 12
12 function c() {}
13 log(c); //12
14
15 function d() {}
16 var d = 12
17 log(d); //12
18 }
19 text6();
另一种较为合理的解释
变量声明提升
即所有声明变量或声明函数都会被提升到当前函数的顶部。
例如下代码:
console.log('x' in window);//true
var x;
x = 0;
//代码执行时js引擎会将声明语句提升至代码最上方,变为:
var x;
console.log('x' in window);//true
x = 0;
函数表达式
var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,而 function getName 是函数声明。关于JS中的各种函数创建方式可以看 大部分人都会做错的经典JS闭包面试题 这篇文章有详细说明。
函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。
例如下代码:
console.log(x);//输出:function x(){}
var x=1;
function x(){}
实际执行的代码为,先将 var x=1 拆分为 var x; 和 x = 1; 两行,再将 var x; 和 function x(){} 两行提升至最上方变成:
var x;
function x(){}
console.log(x);
x=1;
所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。