var,const,let等变量声明解析

155 阅读3分钟

1:var

var变量声明,无论发生在何处,都在执行任何代码之前进行处理。

将赋值给未声明变量的值在执行赋值时将其隐式地创建为全局变量(它将成为全局对象的属性)

2: 声明与为声明区别

  1. 声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的。
  2. 声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建。
  3. 声明变量是它所在上下文环境的不可配置属性,非声明变量是可配置的(如非声明变量可以被删除)。
var a = 1;
b = 2;

delete this.a; // 在严格模式(strict mode)下抛出TypeError,其他情况下执行失败并无任何提示。
delete this.b;

console.log(a, b); // 抛出ReferenceError。
// 'b'属性已经被删除。

3:变量提升

由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明。hosting;

注意点

1:声明初始化两个变量;

var a = 0,b = 0;
等价于
var a = 0;
var b = 0;

2:给两个变量赋值成字符串值

var x = y, y = 'A';
console.log(x + y); // undefinedA

3:多个变量的初始化

var x = 0;

function f(){
  var x = y = 1; // x在函数内部声明,y不是!
}
f();
console.log(x, y); // 0, 1
// x 是全局变量。
// y 是隐式声明的全局变量。 

4:隐式全局变量:是要所处的作用域上没有重复声明

    var x = 0; // x是全局变量,并且赋值为0。
    console.log(typeof z); // undefined,因为z还不存在。
    function a() { // 当a被调用时,
      var y = 2; // y被声明成函数a作用域的变量,然后赋值成2。
      console.log(x, y); // 0 2 
      function b() { // 当b被调用时,
        x = 3; // 全局变量x被赋值为3,不生成全局变量。
        y = 4; // 已存在的外部函数的y变量被赋值为4,不生成新的全局变量。
        z = 5; // 创建新的全局变量z,并且给z赋值为5。 
      } // (在严格模式下(strict mode)抛出ReferenceError)
      b(); // 调用b时创建了全局变量z。
      console.log(x, y, z); // 3 4 5
    }
    a(); // 调用a时同时调用了b。
    console.log(x, z); // 3 5
    console.log(typeof y); // undefined,因为y是a函数的本地(local)变量。

let的使用

let允许你声明一个作用域被限制在块级中的变量、语句或者表达式。与var关键字不同的是,var声明的变量只能是全局或者整个函数块的。

点这里可以明白我们为什么选取“let”这个名字。

与var的区别

在程序或者函数的顶层,let并不会像var一样在全局对象上创造一个属性 没有变量提升与创建块级作用域 重复声明会报错

const

常量是块级作用域,很像使用 let 语句定义的变量。常量的值不能通过重新赋值来改变,并且不能重新声明。

const声明创建一个值的只读引用。