當瀏覽器開始加載我們HTML頁面的時候,首先會提供一個供js代碼執(zhí)行的環(huán)境--->window全局作用域,在window全局作用域下定義的變量-->全局變量,在當前作用域中,js代碼從上到下執(zhí)行之前秧廉,瀏覽器會默認的 先把所有帶var和function關(guān)鍵字的進行提前的聲明或者定義--->預(yù)解釋(變量提升)
帶var關(guān)鍵字的和帶function關(guān)鍵字的在預(yù)解釋的時候是不太一樣的
①var:預(yù)解釋的時候只提前的聲明,在代碼執(zhí)行的過程中才定義賦值
②function:預(yù)解釋的時候聲明+定義都完成了(這也是為什么函數(shù)可以把調(diào)用寫到定義前面的原因)
關(guān)于預(yù)解釋的6條規(guī)律
1拣帽、不管條件是否成立都會進行預(yù)解釋
if (!("a" in window)) {//"a" in window -->true 取反為false疼电,條件不成立
var a = 1;
}
console.log(a);//-->undefined
2、只對"="左邊的進行預(yù)解釋减拭,右邊的是值蔽豺,不進行預(yù)解釋
fn();//Error:fn is not a function
var fn = function () {
console.log(1);
};
fn();
3、自執(zhí)行函數(shù)不進行預(yù)解釋(window下不對自執(zhí)行函數(shù)進行預(yù)解釋;)
;(function (num) {//執(zhí)行的時候形成一個私有的作用域拧粪,在私有的作用域中要進行預(yù)解釋
})(100);
4修陡、函數(shù)體中return 后面的返回值不進行預(yù)解釋,但是下面的代碼可霎,雖然不執(zhí)行魄鸦,但是要進行預(yù)解釋
function fn() {
//私有作用域下的預(yù)解釋:
var num;
return function () {}; //在函數(shù)體中return下面的語句都不在執(zhí)行了
var num = 12;//會進行預(yù)解釋
}
fn();
5、預(yù)解釋只對同一個腳本塊(<script></script>)起作用
6癣朗、如果預(yù)解釋的時候發(fā)現(xiàn)重名了拾因,不重新的聲明,但是需要重新的定義
fn = function(){alert(3)}
fn();
function fn() {
alert(1);
}
var fn;
fn();
function fn() {
alert(2);
}
fn();
var fn = 13;//-->fn=13
function fn() {
alert(3);
}
fn();//-->13() Error:fn is not a function