对于一个名称a,可以有以下三种定义
- 变量声明:var a;
- 函数声明:function a(){}
- 变量赋值:var a = function(){} / var a = 10
其中,变量声明和函数声明都会提升。
1.同名的变量声明和函数声明的优先级
var a;
function a(){
console.log(1)
}
console.log(a); // function a(){....}
function a(){
console.log(1)
}
var a;
console.log(a); // function a(){..}
结论:函数声明 > 变量声明
2. 同名的变量赋值和函数声明的优先级
var a = 10;
function a(){
console.log(1)
}
console.log(a); // 10
var a = function(){
console.log('变量赋值')
}
function a(){
console.log('函数声明')
}
console.log(a); // function a(){'变量赋值'}
结论:变量赋值 > 函数声明
最终结论:变量赋值 > 函数声明 > 变量声明
3.实例
//以下代码执行后, num 的值是?
var foo=function(x,y){
return x-y;
}
function foo(x,y){
return x+y;
}
var num=foo(1,2);
根据优先级顺序,函数赋值>函数声明,因此num为-1。
4.其他
- let声明的变量不能再被同名函数覆盖,会报错。
- var可以多次声明并覆盖。