var f = function(){
console.log(scope); //undefined,只提升了變量的聲明
var scope = 'f';
console.log('sss',scope);//此時結(jié)果是'f'
}
f();
這是 變量提升問題
1. 變量提升,
很簡單,就是把變量提升提到函數(shù)的top的地方。我們需要說明的是,變量提升 只是提升變量的聲明,并不會把賦值也提升上來。
比如:我們定義三個變量:
(function(){
var a='One';
var b='Two';
var c='Three';})()
實際上它是這樣子的:
(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()
這個時候就把變量提升了呀。
好,我們現(xiàn)在回到第一段code里面。為什么會undefined呢?其實,根據(jù)上面變量提升以及js的作用域(塊級作用域)的分析,得知 上面代碼真正變成如下:
var v='Hello World';
(function(){
var v;
alert(v);
v='I love you';
})()
所以,才會提示說“undefined”。
從這里,我們也學(xué)習(xí)到,我們在寫js code 的時候,我們需要把變量放在函數(shù)級作用域的頂端,比如我在上面所舉的例子:var a,b,c;。以防止出現(xiàn)意外。
2. 函數(shù)提升
函數(shù)提升是把整個函數(shù)都提到前面去。
在我們寫js code 的時候,我們有2種寫法,一種是函數(shù)表達式,另外一種是函數(shù)聲明方式。我們需要重點注意的是,只有函數(shù)聲明才能被提升。
函數(shù)聲明方式提升【成功】
function myTest(){
foo();
function foo(){
alert("我來自 foo");
}
}
myTest();
函數(shù)表達式方式提升【失敗】
function myTest(){
foo();// 報錯
console.log('foo output',foo);// 這個代表了變量聲明提升,undefined
var foo =function foo(){
alert("我來自 foo");
}
}
myTest();
function.png