《JavaScript高级程序设计》学习笔记-变量

ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据。每个变量只不过是一个用于保存任意值的命名占位符。有3个关键字可以声明变量:var、const和let。其中,var在ECMAScript的所有版本中都可以使用,而const和let只能在ECMAScript 6及更晚的版本中使用。

var关键字

要定义变量,可以使用var操作符(注意var是一个关键字),后跟变量名(即标识符)。

var a

这行代码定义了一个名为a的变量,可以用它保存任何类型的值。(不初始化的情况下,变量会保存一个特殊值undefined)。

设置值并改变类型

var a = 'a1';
a = 2; // 允许,但不推荐

var声明作用域
使用var操作符定义的变量会成为包含它的函数的局部变量。比如,使用var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁。

在函数内定义变量时省略var操作符,可以创建一个全局变量。虽然可以通过省略var操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。
在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出ReferenceError。

如果需要定义多个变量,可以在一条语句中用逗号分隔每个变量(及可选的初始化)。

在严格模式下,不能定义名为eval和arguments的变量,否则会导致语法错误。

var声明提升
使用var关键字声明的变量会自动提升到函数作用域顶部。

function f(){
  console.log(a);
  var a=10;
}
等价于:
function f(){
  var a;
  console.log(a);
  a=10;
}

所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部。此外,反复多次使用var声明同一个变量也没有问题。

function f(){
  var a = 1;
  var a = 2;
  var a = 3;
  console.log(a); // 3
}

let声明

let跟var的作用差不多,但有着非常重要的区别。最明显的区别是,let声明的范围是块作用域,而var声明的范围是函数作用域。

if(true){
  let age = 20;
  console.log(age); // 20
}
console.log(age); //Reference Error:age没有定义

let也不允许同一个块作用域中出现冗余声明。这样会导致报错。

let a;
let a; // SyntaxError:标识符a已经声明过了

JavaScript引擎会记录用于变量声明的标识符及其所在的块作用域,因此嵌套使用相同的标识符不会报错,而这是因为同一个块中没有重复声明。

对声明冗余报错不会因混用let和var而受影响。这两个关键字声明的并不是不同类型的变量,它们只是指出变量在相关作用域如何存在。

var a;
let a; // SyntaxError
let b;
var b; // SyntaxError

let与var的另一个重要的区别,就是let声明的变量不会在作用域中被提升。
在let声明之前的执行瞬间被称为“暂时性死区”(temporal dead zone),在此阶段引用任何后面才声明的变量都会抛出ReferenceError。

与var关键字不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)。

在let出现之前,for循环定义的迭代变量会渗透到循环体外部。改成使用let之后,这个问题就消失了,因为迭代变量的作用域仅限于for循环块内部。

const声明

const的行为与let基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误。

const声明的限制只适用于它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。

声明风格及最佳实践

1.不使用var
有了let和const,大多数开发者会发现自己不再需要var了。限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。

2.const优先,let次之
使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,很多开发者认为应该优先使用const来声明变量,只在提前知道未来会有修改时,再使用let。这样可以让开发者更有信心地推断某些变量的值永远不会变,同时也能迅速发现因意外赋值导致的非预期行为。

你可能感兴趣的:(《JavaScript高级程序设计》学习笔记-变量)