記錄一下關(guān)于“ 變量提升 ”的理解:
文章參考:
**一 盅弛、 **
我們先看一段很簡單的代碼:
var v='Hello World';
alert(v);
//彈出“Hello World”
再看一段Code:
var v='Hello World';
(function(){
alert(v);
})()
//彈出了“Hello World”
但是一段下面的代碼:
var v='Hello World';
(function(){
alert(v);
var v='I love you';
})()
結(jié)果卻是:
結(jié)果是 *** undefined ***拉庶?
其實,原因就是JavaScript中的 變量提升(Hoisting)便锨;
二、
在解釋提升之前姚建,首先要知道JavaScript中的作用域(scoping)。JavaScript是函數(shù)級作用域(function-level scope)桥胞。這和其他語言(比如:C語言)的塊級作用域是完全不同的考婴。塊(比如:if語句),在JavaScript中并不會創(chuàng)建一個新的作用域沥阱,只有函數(shù)才會創(chuàng)建新的作用域。 如果你必須在函數(shù)中創(chuàng)建一個臨時的作用域策精,請像下面這樣做:
function foo() {
var x = 1;
if (x) {
(function () {
var x = 2;
}());
}
// 此處x仍然等于1
}
下面我們說變量提升
其實就是把變量提升提到函數(shù)的top的地方崇棠。而且需要說明的是,變量提升 只是提升** 變量的聲明 **枕稀,并不會把賦值也提升上來。
比如: 我們定義三個變量:
(function(){
var a='One';
var b='Two';
var c='Three';
})()
實際上它是這樣子的:
(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()
這個時候就把變量提升了凹联。
那么哆档,為什么上面的代碼會報錯(undefined)呢?
我們根據(jù)上面變量提升以及JavaScript的作用域(函數(shù)級作用域)的分析瓜浸,得出上面代碼真正變成如下:
var v='Hello World';
(function(){
var v;
alert(v);
v='I love you';
})()
所以,才會提示說“undefined”偶惠。
換句話說就是朗涩,原來的代碼中雖然沒有 var v;
這行代碼绑改,當(dāng)執(zhí)行到 alert(v);
時兄一,會在當(dāng)前函數(shù)的作用域中尋找變量** V 的定義识腿,而變量 V **的定義語句在alert(v);
之后,所以才會報錯骂束。
** 三、**
同時我們也要注意: 函數(shù)提升 同樣只是是把整個函數(shù)都提到前面去展箱。 在我們寫js code 的時候蹬昌,我們有2中寫法,一種是函數(shù)表達(dá)式皂贩,另外一種是函數(shù)聲明方式。我們需要重點注意的是婴栽,只有函數(shù)聲明形式才能被提升。 函數(shù)聲明方式提升【成功】 復(fù)制代碼代碼如下:
function myTest(){
foo();
function foo(){
alert("我來自 foo");
}
}
myTest();
函數(shù)表達(dá)式方式提升【失敗】 如下:
function myTest(){
foo();
var foo =function foo(){
alert("我來自 foo");
}
}
myTest();
此時就報錯了。