变量

变量的作用域

  • 在js中我们把作用域分为全局作用域和局部作用域,全局作用域就是window,在没 有块级作用域概念的时候,每一个函数都是一个局部作用域。
  • 其实变量的作用域,就说指变量的有效范围。我们最长说的就是在函数中声明的变 量作用域。
  • 当在函数中声明一个变量的时候,如果改变量没有用var关键字去定义那么该变量就 是一个全局变量,但是这样做最容易造成命名冲突。
  • 另一种情况就是使用var声明的变量,这时候的变量就是局部变量,只有在该函数内 部可以访问,在函数外面是访问不到的
  • 在javascript中,函数可以用来创造函数作用域。在函数中搜索变量的时候,如果该 函数当中没有这个变量,那么这次搜索过程会随着代码执行环境创建的作用域 链往外层逐层搜索,一直搜索到window对象为止,找不到就会抛出一个为定义 的错误。而这种从内到外逐层查找的关系在js中我们称为作用域链

let,const,var的区别与联系

  1. 在javascript中我们通常使用var会发生变量提升,即脚本开始运行时,变量已经存在了,但是没有值,所以会输出undefined而let不会发生变量提升,这表示在声明它之前,变量是不存在的,这时如果用到它,就会抛出一个错误。
  2. var 是函数级作用域,let是块级作用域:
  {
    let a = 10;
    var b = 1;
  }
  a // ReferenceError:a is  not defined.
  b // 1
  容易发生错误:
  var a = [];
  for(var i = 0; i < 10; i++){
    a[i] = function(){
      console.log(i);
    };
  }
  a[6](); // 10;
  如果将var i 改为 let i 此时a[6](); 结果是6;
  1. let不允许在相同作用域内,重复声明同一个变量:
   function(){
    let a = 10;
    var a = 1;
  }
  //报错
  function(){
    let a = 10;
    let a = 1;
  }
  //报错
  1. const声明一个只读的常量。一旦声明,常量的值就不能改变
  const PI = 3.1415;
  PI = 3;
  //TypeError: Assignment to constant variable.
  1. const命令声明的常量也是不提升,只能在声明的位置后面使用。
  {
    const a = 10;
  }
  console.log(a);
  //报错
  1. const声明的常量,也与let一样不可重复声明
  2. 对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
  const t = {};
  t.prop = 123;
  console.log(t.prop); // 123
  t = {}; // 报错

变量的生存周期

除了变量作用域之外,另外一个跟闭包有关的概念就是变量的生存周期,对于全局变 量来说,全局变量的生存周期是永久的,除非我们主动销毁这个全局变量,而对于函 数内部的使用var声明的变量来说,当退出函数是,这些变量就会随着函数的结束而销 毁。

你可能感兴趣的:(变量)