var f = function(){
console.log(scope); //undefined,只提升了變量的聲明
var scope = 'f';
console.log('sss',scope);//此時(shí)結(jié)果是'f'
}
f();
這是 變量提升問(wèn)題
1. 變量提升,
很簡(jiǎn)單,就是把變量提升提到函數(shù)的top的地方罐柳。我們需要說(shuō)明的是,變量提升 只是提升變量的聲明狰住,并不會(huì)把賦值也提升上來(lái)张吉。
比如:我們定義三個(gè)變量:
(function(){
var a='One';
var b='Two';
var c='Three';})()
實(shí)際上它是這樣子的:
(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()
這個(gè)時(shí)候就把變量提升了呀。
好催植,我們現(xiàn)在回到第一段code里面肮蛹。為什么會(huì)undefined呢?其實(shí)创南,根據(jù)上面變量提升以及js的作用域(塊級(jí)作用域)的分析伦忠,得知 上面代碼真正變成如下:
var v='Hello World';
(function(){
var v;
alert(v);
v='I love you';
})()
所以,才會(huì)提示說(shuō)“undefined”稿辙。
從這里昆码,我們也學(xué)習(xí)到,我們?cè)趯?xiě)js code 的時(shí)候邻储,我們需要把變量放在函數(shù)級(jí)作用域的頂端赋咽,比如我在上面所舉的例子:var a,b,c;。以防止出現(xiàn)意外吨娜。
2. 函數(shù)提升
函數(shù)提升是把整個(gè)函數(shù)都提到前面去脓匿。
在我們寫(xiě)js code 的時(shí)候,我們有2種寫(xiě)法萌壳,一種是函數(shù)表達(dá)式,另外一種是函數(shù)聲明方式日月。我們需要重點(diǎn)注意的是袱瓮,只有函數(shù)聲明才能被提升。
函數(shù)聲明方式提升【成功】
function myTest(){
foo();
function foo(){
alert("我來(lái)自 foo");
}
}
myTest();
函數(shù)表達(dá)式方式提升【失敗】
function myTest(){
foo();// 報(bào)錯(cuò)
console.log('foo output',foo);// 這個(gè)代表了變量聲明提升爱咬,undefined
var foo =function foo(){
alert("我來(lái)自 foo");
}
}
myTest();
function.png