理解变量提升

基础赋值提升

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)
}

 

 
上一篇:模拟 call、apply、bind 方法


下一篇:带你学习c++系列(一)我把自己写成了一个类