變量提升是面試中非常常見的一個問題
比如 var 和 let 的區別是什么?
答案之一就有 let 不會變量提升
1.概念
最基礎的概念大家都知道
console.log(a); var a = 1;
// 輸出
在代碼中 使用 var 來聲明變量的時候,會提到當前作用域的頂端,而賦值操作在原處不變
上面的兩行代碼相當於
var a; console.log(a); a = 1;
var a聲明向上提升,a=1賦值留在原處
2.多個script的情況
<script> console.log(a) </script> <script> var a = 1; </script>
// 控制台報錯
這樣控制台就報錯了
ReferenceError: a is not defined
變量提升不能跨script
3.其它情況
首先看不用var直接賦值
console.log(a); //ReferenceError: a is not defined a = 1;
同樣報錯,因為使用 var才會變量提升(我所知)
在 if 中
console.log(a) // undifined if(false){ var a = 1; }
盡管 if 不通過,還是提升了
4.函數提升
變量聲明會提示,函數聲明也會
console.log(foo); var foo=10; console.log(foo); function foo(){ } console.log(foo);
//輸出 function a,10,10
函數會優先於變量 先提升
上面代碼相當於
function a(){ } var a; console.log(a); a=10; console.log(a); console.log(a);
當時,如果用函數表達式,那就只提升了這個 a變量,符合之前的變量提升的邏輯
a(); var a = function () { console.log(1) }
//