语法

区分大小写

ECMAScript中一切都区分大小写,无论是变量、函数名还是操作符

标识符

所谓标识符,就是变量、函数、属性或函数参数的名称。
标识符可以由一或多个下列字符组成:

  • 第一个字符必须是一个字母、下划线(_)或美元符号($)
  • 剩下的其他字符可以是字母、下划线、美元符号或数字

按照惯例,ECMAScript标识符使用驼峰大小写形式,即第一个单词的首字母小写,后面每个单词的 首字母大写
注意:关键字、保留字、true、false和null不能作为标识符

变量

ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据,每一个变量只不过是一个用于保存任意值的命名占位符

var关键字

使用var定义变量,ECMAScript实现变量初始化,因此可以同时定义变量并设置它的值

  1. var message='hi'

初始化变量不会将它标识为字符串类型,只是简单的赋值而已。

  • 作用域
  1. 使用var操作符定义的变量会成为包含它的函数的局部变量。比如使用var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁
  2. 在函数内定义变量可以忽略var操作符,创建一个全局变量(不推荐,会导致全局变量很难维护)
  3. 在一条语句中可以用逗号分隔每个变量
  • var声明提升
  1. 使用var关键字声明的变量会自动提升到函数作用域顶部,所以多次使用var声明同一个变量是没问题的
    1. function foo() {
    2. console.log(age);
    3. var age = 26;
    4. }
    5. foo() // undefined
    变量提升后 ```javascript function foo() { var age console.log(age); age = 26; } foo() // undefined
  1. <a name="ZXFfJ"></a>
  2. #### let 声明
  3. let的声明的范围是块作用域,而var声明的范围是函数作用域<br />简单理解:外部作用域中的变量不能访问函数作用域内的数据
  4. ```javascript
  5. if (true) {
  6. var name = 'karim'
  7. console.log(name); // karim
  8. }
  9. console.log(name); // karim

var声明的方位的作用域下数据可访问

  1. if (true) {
  2. let name = 'karim'
  3. console.log(name); // karim
  4. }
  5. console.log(name); // ReferenceError

let声明的变量不能在if块外部被引用,它的作用域仅限于该块内部
注意:let不允许同一个块作用域中出现冗余声明

  1. var name1
  2. var name2
  3. let name1 // SyntaxError name1已经被声明过
  4. let name2

并且,不会因为混用let和var而受影响

  • 暂时性死区

let与var的另一个重要的区别,就是let声明的变量不会在作用域中被提升

  1. console.log(age);
  2. let age = 26
  3. // ReferenceError

在解析代码时,JavaScript引擎也会注意出现在块后面的let声明,只不过在此之前不能以任何方式来引用未声明的变量。在let声明之前的执行瞬间被称为”暂时性死区”,在此阶段引用任何后面才声明的变量都会抛出”ReferenceError”错误

  • 全局声明

使用let在全局作用域中声明的变量不会称为window对象的属性(var 声明的变量则会)

  • 条件声明

在使用var变量时,由于声明会被提升,JavaScript引擎会自动将多余的声明在作用域顶部合并为一个声明。let作用域是块,所以不会检查前面是否已经使用let声明过同名变量,也就不会再没有声明的情况下声明它

  • for循环中的let声明

在for循环中迭代变量的作用域仅限于for循环内部