基础赋值提升
console.log(a); var a = 1;// 输出 undefined
相当于代码:
var a; console.log(a); a = 1;
在代码中使用 var 来声明变量的时候,会提到当前作用域的顶端,而赋值操作在原处不变。
var a声明向上提升,a=1赋值留在原处。
不使用var赋值
console.log(a); //ReferenceError: a is not defined console.log(b); //ReferenceError: a is not defined a = 1; let b = 1;
控制台报错,只有使用 var才会变量提升。
在 if 中提升
console.log(a) // undifined if(false){ var a = 1; }
相当于代码:
var a console.log(a) // undifined if(false){ a = 1; }
多个<script>
<script> console.log(a) </script> <script> var a = 1; </script>// 控制台报错
控制台报错:ReferenceError: a is not defined,变量提升不能跨script 。
函数提升
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) }//TypeError: a is not a function
相当于代码:
var a a(); a = function () { console.log(1) }