在js中存在变量提升和函数提升两种。提升就是在没有声明变量或者函数的情况下便使用了,但是在使用后又声明或者是赋值了(直接赋值了,就提升为全局变量或者全局函数),这时就会出现提升,即声明置顶,所以此时的变量值是undefined。
console.log(variable);
var variable = '我是全局中的变量'; // undefined
等于
var variable
console.log(variable);
variable = '我是全局中的变量'; // undefined
而函数提升则分为两种,根据自身的定义方式:声明式即function functionName(){ },定义式即var functionName=function(){ }。
定义式跟变量提升一样
console.log(variable);
var variable=function(){
console.log('nnn')
} // undefined
等于
var variable
console.log(variable);
variable=function(){
console.log('nnn')
} // undefined
声明式则直接提升了整个定义。
console.log(variable);
function variable(){
console.log('nnn')
} // f variable()
等于
function variable(){
console.log('nnn')
}
console.log(variable); // f variable()
其中函数提升的优先级也高于变量提升。
function a(s){
console.log(s);
var s=2;
console.log(s);
function s(){};
console.log(s)
};
a(1) //ƒ s(){} 2 2
等于
function a(s){
function s(){};
var s;
console.log(s);
s=2;
console.log(s);
console.log(s);
};
a(1)
而函数声明比变量声明更优先。所以function a(s){ function s(){}; var s; console.log(s); //f s(){} };
注意这里只是声明优先级更高,赋值还是遵循后来者居上哦。函数之间和函数之间、变量和变量之间的(同类同名)声明、赋值都是后来者居上。