一、變量提升
在ES6之前葱跋,JavaScript沒有塊級(jí)作用域(一對(duì)花括號(hào){}即為一個(gè)塊級(jí)作用域)喻圃,只有全局作用域和函數(shù)作用域。變量提升即將變量聲明提升到它所在作用域的最開始的部分村视。上個(gè)簡(jiǎn)歷的例子如:
console.log(global);// undefined
varglobal ='global';
console.log(global);// global
functionfn () {
console.log(a);// undefined
vara ='aaa';
console.log(a);// aaa
}
fn();
之所以會(huì)是以上的打印結(jié)果,是由于js的變量提升酒奶,實(shí)際上上面的代碼是按照以下來(lái)執(zhí)行的:
varglobal;// 變量提升蓖议,全局作用域范圍內(nèi),此時(shí)只是聲明讥蟆,并沒有賦值
console.log(global);// undefined
global ='global';// 此時(shí)才賦值
console.log(global);// 打印出global
functionfn () {
vara;// 變量提升勒虾,函數(shù)作用域范圍內(nèi)
console.log(a);
a ='aaa';
console.log(a);
}
fn();
二、函數(shù)提升
js中創(chuàng)建函數(shù)有兩種方式:函數(shù)聲明式和函數(shù)字面量式瘸彤。只有函數(shù)聲明才存在函數(shù)提升修然!如:
console.log(f1);// function f1() {}
console.log(f2);// undefined
functionf1() {}
varf2 =function() {}
只所以會(huì)有以上的打印結(jié)果,是由于js中的函數(shù)提升導(dǎo)致代碼實(shí)際上是按照以下來(lái)執(zhí)行的:
functionf1() {}// 函數(shù)提升质况,整個(gè)代碼塊提升到文件的最開始
console.log(f1);
console.log(f2);
varf2 =function() {}
結(jié)語(yǔ):基本上就是這樣愕宋,要熟練掌握的話可以多做些練習(xí),test:
console.log(f1());
console.log(f2);
functionf1() {console.log('aa')}
varf2 =function() {}
(function() {
console.log(a);
a ='aaa';
vara ='bbb';
console.log(a);
})();