变量晋升:
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);