语法
区分大小写
ECMAScript中一切都区分大小写,无论是变量、函数名还是操作符
标识符
所谓标识符,就是变量、函数、属性或函数参数的名称。
标识符可以由一或多个下列字符组成:
- 第一个字符必须是一个字母、下划线(
_
)或美元符号($
) - 剩下的其他字符可以是字母、下划线、美元符号或数字
按照惯例,ECMAScript标识符使用驼峰大小写形式,即第一个单词的首字母小写,后面每个单词的 首字母大写
注意:关键字、保留字、true、false和null不能作为标识符
变量
ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据,每一个变量只不过是一个用于保存任意值的命名占位符
var关键字
使用var定义变量,ECMAScript实现变量初始化,因此可以同时定义变量并设置它的值
var message='hi'
初始化变量不会将它标识为字符串类型,只是简单的赋值而已。
- 作用域
- 使用var操作符定义的变量会成为包含它的函数的局部变量。比如使用var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁
- 在函数内定义变量可以忽略var操作符,创建一个全局变量(不推荐,会导致全局变量很难维护)
- 在一条语句中可以用逗号分隔每个变量
- var声明提升
- 使用var关键字声明的变量会自动提升到函数作用域顶部,所以多次使用var声明同一个变量是没问题的
变量提升后 ```javascript function foo() { var age console.log(age); age = 26; } foo() // undefinedfunction foo() {
console.log(age);
var age = 26;
}
foo() // undefined
<a name="ZXFfJ"></a>
#### let 声明
let的声明的范围是块作用域,而var声明的范围是函数作用域<br />简单理解:外部作用域中的变量不能访问函数作用域内的数据
```javascript
if (true) {
var name = 'karim'
console.log(name); // karim
}
console.log(name); // karim
var声明的方位的作用域下数据可访问
if (true) {
let name = 'karim'
console.log(name); // karim
}
console.log(name); // ReferenceError
let声明的变量不能在if块外部被引用,它的作用域仅限于该块内部
注意:let不允许同一个块作用域中出现冗余声明
var name1
var name2
let name1 // SyntaxError name1已经被声明过
let name2
并且,不会因为混用let和var而受影响
- 暂时性死区
let与var的另一个重要的区别,就是let声明的变量不会在作用域中被提升
console.log(age);
let age = 26
// ReferenceError
在解析代码时,JavaScript引擎也会注意出现在块后面的let声明,只不过在此之前不能以任何方式来引用未声明的变量。在let声明之前的执行瞬间被称为”暂时性死区”,在此阶段引用任何后面才声明的变量都会抛出”ReferenceError”错误
- 全局声明
使用let在全局作用域中声明的变量不会称为window对象的属性(var 声明的变量则会)
- 条件声明
在使用var变量时,由于声明会被提升,JavaScript引擎会自动将多余的声明在作用域顶部合并为一个声明。let作用域是块,所以不会检查前面是否已经使用let声明过同名变量,也就不会再没有声明的情况下声明它
- for循环中的let声明
在for循环中迭代变量的作用域仅限于for循环内部