变量提升:
js代码再运行的时候,扫描所有的变量及函数,将其提升在作用域的顶部。
不在函数内部的var定义的是全局变量,提升到作用域顶部;
函数,讲整个函数体都提升到作用域顶部;
如果函数是以定义变量,赋值匿名函数的方式存在,那么不存在函数体提升的情况。
优先级的比较:
函数名和变量名冲突时,函数的优先级较高;
全局变量和局部变量命名冲突时,局部作用域中,局部变量的优先级比较高;
参数的优先级大于变量提升的优先级。
经典例题:
var a = 1;
console.log(a); //1
console.log(b); //undefined
var b = 1;
console.log(b); //1
console.log(a); //function a(){};
function a(){};
var a = 1;
console.log(a); //1
var fn = function(){
console.log('test'); //test
};
fn();
console.log(a); //undefined
var a = 1;
console.log(a); //1
var a = function(){};
console.log(a); //函数
var a = 1;
function fn(){
console.log(a); //1
var b = 1;
}
fn();
console.log(b); //b is not defined
var a = 1;
function fn(){
console.log(b); //undefined
var b = 1;
}
fn();
var a = 1;
function fn(){
console.log(a); //undefined
var a = 2;
}
console.log(a); //1
fn(); //先是1,才是undefined
function sum(a){
console.log(a); //1
var a = 2;
}
sum(1);
function sum(a){
var a = 2;
console.log(a); //2
}
sum(1);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。