mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-28 13:02:21 +00:00
docs(let): edit const
This commit is contained in:
parent
002618ac5e
commit
9bb12ab3d2
29
docs/let.md
29
docs/let.md
@ -173,13 +173,13 @@ let x = x;
|
||||
|
||||
上面代码报错,也是因为暂时性死区。使用`let`声明变量时,只要变量在还没有声明完成前使用,就会报错。上面这行就属于这个情况,在变量`x`的声明语句还没有执行完成前,就去取`x`的值,导致报错”x 未定义“。
|
||||
|
||||
ES6规定暂时性死区和`let`、`const`语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
|
||||
ES6 规定暂时性死区和`let`、`const`语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
|
||||
|
||||
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
|
||||
|
||||
### 不允许重复声明
|
||||
|
||||
let不允许在相同作用域内,重复声明同一个变量。
|
||||
`let`不允许在相同作用域内,重复声明同一个变量。
|
||||
|
||||
```javascript
|
||||
// 报错
|
||||
@ -230,7 +230,7 @@ function f() {
|
||||
f(); // undefined
|
||||
```
|
||||
|
||||
上面代码中,函数f执行后,输出结果为`undefined`,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。
|
||||
上面代码中,函数`f`执行后,输出结果为`undefined`,原因在于变量提升,导致内层的`tmp`变量覆盖了外层的`tmp`变量。
|
||||
|
||||
第二种场景,用来计数的循环变量泄露为全局变量。
|
||||
|
||||
@ -244,11 +244,11 @@ for (var i = 0; i < s.length; i++) {
|
||||
console.log(i); // 5
|
||||
```
|
||||
|
||||
上面代码中,变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
|
||||
上面代码中,变量`i`只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
|
||||
|
||||
### ES6的块级作用域
|
||||
|
||||
`let`实际上为JavaScript新增了块级作用域。
|
||||
`let`实际上为 JavaScript 新增了块级作用域。
|
||||
|
||||
```javascript
|
||||
function f1() {
|
||||
@ -262,7 +262,7 @@ function f1() {
|
||||
|
||||
上面的函数有两个代码块,都声明了变量`n`,运行后输出5。这表示外层代码块不受内层代码块的影响。如果使用`var`定义变量`n`,最后输出的值就是10。
|
||||
|
||||
ES6允许块级作用域的任意嵌套。
|
||||
ES6 允许块级作用域的任意嵌套。
|
||||
|
||||
```javascript
|
||||
{{{{{let insane = 'Hello World'}}}}};
|
||||
@ -482,7 +482,7 @@ let x = do {
|
||||
|
||||
上面代码中,变量`x`会得到整个块级作用域的返回值。
|
||||
|
||||
## const命令
|
||||
## const 命令
|
||||
|
||||
`const`声明一个只读的常量。一旦声明,常量的值就不能改变。
|
||||
|
||||
@ -496,7 +496,7 @@ PI = 3;
|
||||
|
||||
上面代码表明改变常量的值会报错。
|
||||
|
||||
`const`声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
|
||||
`const`声明的变量不得改变值,这意味着,`const`一旦声明变量,就必须立即初始化,不能留到以后赋值。
|
||||
|
||||
```javascript
|
||||
const foo;
|
||||
@ -537,15 +537,16 @@ const message = "Goodbye!";
|
||||
const age = 30;
|
||||
```
|
||||
|
||||
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。`const`命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
|
||||
`const`实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,`const`只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
|
||||
|
||||
```javascript
|
||||
const foo = {};
|
||||
|
||||
// 为 foo 添加一个属性,可以成功
|
||||
foo.prop = 123;
|
||||
foo.prop // 123
|
||||
|
||||
foo.prop
|
||||
// 123
|
||||
|
||||
// 将 foo 指向另一个对象,就会报错
|
||||
foo = {}; // TypeError: "foo" is read-only
|
||||
```
|
||||
|
||||
@ -553,7 +554,7 @@ foo = {}; // TypeError: "foo" is read-only
|
||||
|
||||
下面是另一个例子。
|
||||
|
||||
```js
|
||||
```javascript
|
||||
const a = [];
|
||||
a.push('Hello'); // 可执行
|
||||
a.length = 0; // 可执行
|
||||
@ -587,7 +588,7 @@ var constantize = (obj) => {
|
||||
};
|
||||
```
|
||||
|
||||
ES5只有两种声明变量的方法:`var`命令和`function`命令。ES6除了添加`let`和`const`命令,后面章节还会提到,另外两种声明变量的方法:`import`命令和`class`命令。所以,ES6一共有6种声明变量的方法。
|
||||
ES5 只有两种声明变量的方法:`var`命令和`function`命令。ES6除了添加`let`和`const`命令,后面章节还会提到,另外两种声明变量的方法:`import`命令和`class`命令。所以,ES6 一共有6种声明变量的方法。
|
||||
|
||||
## 顶层对象的属性
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user