javascript變量和函數提升
當瀏覽器處理JavaScript代碼的時,包括變量和函數在內的所有聲明都會在任何代碼被執行前被處理了
變量提升
在javascript中,有一個神奇的現象,就是有時候變量聲明在後面,卻在前面就可以調用。代碼如下
console.log(a);
var a = 5;
變量a的聲明被提升到了當前作用域的頂端,即變量提升
但是因爲僅僅是變量聲明提升了,後面賦值語句並不會提升,conole.log打印a時候,此時a是未賦值的,所有爲undefined。
函數提升
在同一個<script…/>元素內,JavaScript允許先調用函數,然後在後面再定義函數,相當於提前聲明瞭該函數。代碼如下:
<script>
console.log(add(2,5));
function add(a,b){
sum=a+b;
return sum;
}
</script>
可以看到,我們先調用的函數後聲明的函數,說明函數在運行前已經被提前到了最前面。
我們都知道,創建函數有聲明式和字面量。下面試試字面量,代碼如下:
<script>
console.log(add(2,5));
var add = function add(a,b){
sum=a+b;
return sum;
}
</script>
發現控制檯出現報錯
我們可以將add看作變量,它的聲明語句會被提升到頂端,但賦值語句(函數體)並不會提升。可以看出,只有函數聲明纔有提升。
總結:
我們現在已經知道變量和函數都會提升,那麼誰的優先級更高呢,測試一下。
console.log(add(2,5));
function add(a,b){
sum=a+b;
return sum;
}
var add = 0
運行後結果是函數結果,而不是undefined,說明雖然都提升了,可以看出,變量的局部提升優先於函數聲明的整體提升。