注:变量提升,更通俗的说法是将“识别符”提升到它所作用域的最前面。
比如:函数里面申明一个变量,var i=10;这个i就是标识符,浏览器在识别代码时,自动将函数内的变量提到最前面,但只是将var i 提到了作用域的最前面,并没有进行赋值。下面举两个例子说明下变量提升。
1.全局变量的提升
例:
console.log(a); //undefined
var a=10; //var a 默认进行提升到第一行
实际运行代码:
var a;
console.log(a);
a = 10;
2.局部变量的提升
例:
function fn()
{
console.log(a)
var a=10;
}
实际代码:实际函数内部是将声明变量提到前面。
function fn{
var a;
console.log(a);
a=10;
}
函数提升
在js中函数有两种声明方法,是函数声明式、函数字变量式。
函数声明式:function fn(){}
函数字变量式:var fn = function (){}
在js中只有函数声明式才可以进行函数提升,函数字变量式不可以进行函数提升
why:
函数字变量式:
console.log(fn())
var fn = function(){document.write("#");}
实际代码:在浏览器加载页面代码时,浏览器会将函数的标识符提到作用域的最前面。
var fn;
console.log(fn()); //undefined
fn = function(){document.write("#");}
函数声明式可以直接提升,跟变量提升一样,当使用浏览器时,浏览器会自动将函数提到作用域最前,function fn(){}可提升又可赋值。换言之:函数整体就会提到其作用域的最前端。