變量提升與函數(shù)提升
var v='jirengu';
console.log(v);
我們知道 這個時候運(yùn)行a() 輸出 jirengu ;
而
var v='jirengu';
function a(){
console.log(v);
var v="abcd";
}
這個時候a()輸入結(jié)果卻為undefined
Paste_Image.png
而這種情況
var v='jirengu';
if(1>0){
console.log(v);
var v="abcd";
}
這里console.log(V)輸入結(jié)果為jirengu;
這里就涉及到Javascript的變量提升
顧名思義變量提升就是逆屡,是把下面的東西提到上面。在函數(shù)域里定義一個和外部變量一樣名稱的變量時,變量的聲明會提升至第一句惋砂,賦值則不會變鞠绰。
所以上面一段代碼應(yīng)為
var v='jirengu';
function a(){
var v;
console.log(v);
v="abcd";
}
這時候就很好理解為什么console.log(V)的值為undefied;
函數(shù)提升
在寫JS代碼的時候祠挫,有兩種寫法那槽,一種是函數(shù)表達(dá)式,另外一種是函數(shù)聲明方式等舔。我們需要重點(diǎn)注意的是骚灸,只有函數(shù)聲明形式才能被提升。
console.log(typeof foo);
console.log(typeof bar);
console.log(typeof add);
//函數(shù)的聲明
function foo(){
alert('foo');
}
//命名函數(shù)表達(dá)式
var bar = function(){
alert('bar');
};
// 函數(shù)表達(dá)式-匿名函數(shù)
var add = function(a,b){
return a+b;
};
這個時候輸出結(jié)果為 function ,undefined,undefined;
不像其他對面對象的編程語言(比方說C++慌植,Java等等)甚牲,javascript沒有塊級作用域(被花括號包圍的)义郑;當(dāng)是,javascript有擁有函數(shù)級別的作用域丈钙,也就是說魔慷,在一個函數(shù)內(nèi)定義的變量只能在函數(shù)內(nèi)部訪問或者這個函數(shù)內(nèi)部的函數(shù)訪問≈鳎——塊院尔,如if語句,并不會創(chuàng)建一個新的作用域喉誊。只有函數(shù)才會創(chuàng)建新的作用域邀摆。
參考:###Javascript變量提升和函數(shù)提升