JS不像C語言,C語言是先聲明后使用,否則會報錯。但JS中,有變量提升現象,可以先使用后聲明。
JS存在變量提升,這個設計其實是低劣的,或者是語言實現時的一個副作用。它允許變量不聲明就可以訪問,或聲明在后使用在前。
但在ES6加入let/const后,變了Hoisting就不存在了。
變量提升
把變量提升到函數top的地方。但要注意僅僅是變量提升,賦值并不提升。
var v = 'Hello World';
(function() {
alert(v); // undefined
var v = 'I love you';
})()
相當于:
var v = 'Hello World';
(function() {
var v;
alert(v);
var v = 'I love you';
})()
所以,才會提示說“undefined”。
(function(){
var a='One';
var b='Two';
var c='Three';
})()
實際上她是這個樣子:
(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()
這個時候就把變量提升了。
從這里,我們也學習到,我們在寫js code 的時候,需要把變量放在塊級作用域的頂端,比如我在上面所舉的例子:var a,b,c;。防止出現意外。
函數提升
函數提升是把整個函數都提到前面去。
在我們寫js code 的時候,我們有2中寫法,一種是函數表達式,另外一種是函數聲明方式。
我們需要重點注意的是:
- 只有函數聲明形式才能被提升。
1、函數聲明形式 【成功】
function myTest(){
foo();
function foo(){
alert("我來自 foo");
}
}
myTest();
2、函數表達式方式【失敗】
function myTest(){
foo();
var foo =function foo(){
alert("我來自 foo");
}
}
myTest();