• ECMAScript中的变量是松散的,每个变量只不过是一个保存任意值的“占位符”
  • 3个关键字可以声明变量:varconstlet,后两个只能在ES6+版本中使用

var

  • 用法:var关键字后跟变量名
  • 变量未初始化时,默认值为undefined
  • 初始化变量时,只是简单的赋值,并不会将其标识为相应的数据类型
  • 关于作用域的问题:
    在函数内部使用var关键字声明的变量,会成为该函数的局部变量,在函数调用结束后被立即销毁,去掉关键字var后,该变量成为全局变量,但不建议这样做
  • Tip:严格模式下,给未声明的变量赋值会引发 ReferenceError 错误
  • 一条语句中定义多个变量时,变量间使用逗号分隔
  • Tip:严格模式下,不能将变量命名为evalarguments
  • 使用var声明的变量会自动提升(hoist)到函数作用域顶部

  • 多次使用var声明同一个变量不会出现问题

let

  • 与var声明的函数作用域不同,let声明的是块作用域


  • 不允许同一个块中出现冗余声明

  • 暂时性死区
    let声明的变量不会中作用域中被提升,声明之前的执行瞬间称为“暂时性死区”(temporal dead zone),在此阶段引用任何后面声明的变量都会抛出 ReferenceError
  • 在全局作用域中使用var声明的变量会成为window对象的属性,而使用let声明则不会


  • 条件声明
    let声明的变量被限制在该块中,不能像var声明那样使用try-catch或typeof来进行条件声明


  • 在for循环中的使用var声明循环变量时,变量会渗透到循环外面,而使用let声明时,循环变量就仅限于循环内部


  • 同时,使用let声明变量也能避免一些奇怪的修改(JavaScript引擎会为for循环中的let声明分别创建独立的变量实例)


const

  • 使用const声明的变量的行为与let声明的变量的行为基本相同,唯一的不同就是变量声明的同时必须初始化
  • 修改const声明的变量会导致错误,因此,不能用其声明迭代变量

最佳实践

  • 既然声明变量的方式这么多,那么如何选择就是个问题了,一般遵循的原则:
    不使用varconst优先、let次之
posted on 2021-10-11 11:52  KK的备忘录  阅读(66)  评论(0)    收藏  举报