JavaScript高级程序设计(4)
第3章 语言基础(1)语法变量
### 3.1 语法 21 ##### 3.1.1 区分大小写 - > ECMAScript中一切都区分大小写。无论是变量、函数名还是操作符,都区分大小写。 ##### 3.1.2 标识符 - > 所谓标识符,就是变量、函数、属性或函数参数的名称。标识符可以由一或多个下列字符组成: > > - 第一个字符必须是一个字母、下划线(_)或美元符号($); > > - 剩下的其他字符可以是字母、下划线、美元符号或数字。 > > 注意 关键字、保留字、true、false和null不能作为标识符。 ##### 3.1.3 注释 - > 单行注释以两个斜杠字符开头 > > 块注释以一个斜杠和一个星号(/*)开头,以它们的反向组合(*/)结尾 ##### 3.1.4 严格模式 - > 要对整个脚本启用严格模式,在脚本开头加上这一行: > > ```javascript > "use strict"; > ``` > > 也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可: > > ```javascript > function doSomething() { > "use strict"; > // 函数体 > } > ``` ##### 3.1.5 语句 - > ECMAScript中的语句以分号结尾。省略分号意味着由解析器确定语句在哪里结尾,如下面的例子所示: > > ```javascript > let sum = a + b // 没有分号也有效,但不推荐 > let diff = a - b; // 加分号有效,推荐 > ``` > > 多条语句可以合并到一个C语言风格的代码块中。代码块由一个左花括号({)标识开始,一个右花括号(})标识结束: > > ```javascript > // 有效,但容易导致错误,应该避免 > if (test) > console.log(test); > > // 推荐 > if (test) { > console.log(test); > } > ``` ### 3.2 关键字与保留字 23 > ECMA-262第6版规定的所有关键字如下: > > ```javascript > break do in typeof case else instanceof var > catch export new void class extends return while > const finally super with continue for switch yield > debugger function this default if throw > delete import try > ``` > > 以下是ECMA-262第6版为将来保留的所有词汇 > > ```javascript > 始终保留: > enum > > 严格模式下保留: > implements package public > interface protected static > let private > > 模块代码中保留: > await > ``` ### 3.3 变量 24 ##### 3.3.1 var关键字 >var声明作用域:使用var操作符定义的变量会成为包含它的函数的局部变量。 > >var声明提升:使用这个关键字声明的变量会自动提升到函数作用域顶部。 ```javascript var message; //定义了一个名为message的变量,可以用它保存任何类型的值 var message = "hi"; //message被定义为一个保存字符串值hi的变量 var message = "hi",found = false,age = 29; //定义多个变量 ``` ##### 3.3.2 let声明 - let跟var最明显的区别是,let声明的范围是块作用域,而var声明的范围是函数作用域。 ```javascript if (true) { var name = 'Matt'; console.log(name); // Matt } console.log(name); // Matt if (true) { let age = 26; console.log(age); // 26 } console.log(age); // ReferenceError: age没有定义 ``` - let也不允许同一个块作用域中出现冗余声明 ```javascript var name; var name; let age; let age; // SyntaxError;标识符age已经声明过了 ``` - let与var的另一个重要的区别,就是let声明的变量不会在作用域中被提升。 ```javascript // name会被提升 console.log(name); // undefined var name = 'Matt'; // age不会被提升 console.log(age); // ReferenceError:age没有定义 let age = 26; ``` - 与var关键字不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)。 ```javascript var name = 'Matt'; console.log(window.name); // 'Matt' let age = 26; console.log(window.age); // undefined ``` - 对于let这个新的ES6声明关键字,不能依赖条件声明模式。 在使用var声明变量时,由于声明会被提升,JavaScript引擎会自动将多余的声明在作用域顶部合并为一个声明。因为let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量,同时也就不可能在没有声明的情况下声明它。使用try/catch语句或typeof操作符也不能解决,因为条件块中let声明的作用域仅限于该块。 - for循环中的let声明 ```javascript //在let出现之前,for循环定义的迭代变量会渗透到循环体外部, for (var i = 0; i < 5; ++i) { // 循环逻辑 } console.log(i); // 5 //改成使用let之后,这个问题就消失了,因为迭代变量的作用域仅限于for循环块内部 for (let i = 0; i < 5; ++i) { // 循环逻辑 } console.log(i); // ReferenceError: i没有定义 ``` ##### 3.3.3 const声明 const的行为与let基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误。 ```javascript const age = 26; age = 36; // TypeError:给常量赋值 // const也不允许重复声明 const name = 'Matt'; const name = 'Nicholas'; // SyntaxError // const声明的作用域也是块 const name = 'Matt'; if (true) { const name = 'Nicholas'; } console.log(name); // Matt ``` const声明的限制只适用于它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。 ```javascript const person = {}; person.name = 'Matt'; // ok ``` 不过,如果你只想用const声明一个不会被修改的for循环变量,那也是可以的。也就是说,每次迭代只是创建一个新变量。这对for-of和for-in循环特别有意义: ```javascript let i = 0; for (const j = 7; i < 5; ++i) { console.log(j); } // 7, 7, 7, 7, 7 for (const key in {a: 1, b: 2}) { console.log(key); } // a, b for (const value of [1,2,3,4,5]) { console.log(value); } // 1, 2, 3, 4, 5 ``` ##### 3.3.4 声明风格及最佳实践 - **1.不使用var** 有了let和const,大多数开发者会发现自己不再需要var了。限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。 - **2.const优先,let次之** 使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,很多开发者认为应该优先使用const来声明变量,只在提前知道未来会有修改时,再使用let。这样可以让开发者更有信心地推断某些变量的值永远不会变,同时也能迅速发现因意外赋值导致的非预期行为。
顶部
收展
底部
[TOC]
目录
第1章 JavaScript简介
第2章 在 HTML中使用JavaScript
第3章 语言基础(1)语法变量
第3章 语言基础(2)数据类型
第3章 语言基础(3)操作符
第3章 语言基础(4)语句
第4章 变量、作用域与内存
第5章 基本引用类型
第6章 集合引用类型
第7章 迭代器与生成器
第8 章对象、类与面向对象编程
第9章 代理与反射
第10章 函数
第11章 期约与异步函数
第12章 BOM
第13章 客户端检测
第14章 DOM
第15章 DOM 扩展
第16章 DOM2 和 DOM3
第17章 事件
第18章 动画与 Canvas 图形
第19章 表单脚本
第20章 JavaScript API
第21章 错误处理与调试
第22章 处理 XML
第23章 JSON
第24章 网络请求与远程资源
第25章 客户端存储
第26章 模块
第27章 工作者线程
第28章 最佳实践
相关推荐
WebSocket