# Let命令
## 定義Let變量
在ES6中引入了let命令,通過let命令定義的變量只能在let命令所在的代碼塊內部被引用。
```javascript
"use strict"
{
let hello = "Hello World!"
}
console.log(hello) //會報錯,因為沒有全局的hello變量被定義
```
從上面的例子可以看出,使用Let命令定義的變量不會自動被提升為全局變量。相反的情況,如果在上面的例子中,你使用var來定義hello這個變量,那么hello這個變量將自動被提升為全局變量,就可以被后面的console.log訪問了。
## 變量死區
ES6中規定,如果你在一個代碼區塊中使用了let命令來定義變量,那么在變量被定義之前,不允許對這個變量的訪問存在。因此在let命令之前的所有代碼被稱為變量死區。如果在變量死區發生了對變量的引用,那么JavaScript引擎將報錯。
```javascript
"use strict"
{
console.log(hello); //將報錯,因為變量聲明在之后
let hello = "Hello World!";
}
#正確代碼
{
let hello = "Hello World!";
console.log(hello);
}
```
## 不能重復聲明變量
在同一個代碼區塊中,你不能使用let/var命令重復定義一個已經已經存在的變量。因此下面的代碼將報錯。
```javascript
"use strict"
{
let hello = "Hello World!";
let hello = "Hello Not World!";//報錯
console.log(hello);
}
{
let hello = "Hello World!";
var hello = "Hello Not World!";//報錯
console.log(hello);
}
```
## 塊級作用域
ES6引入let命令的一個副作用就是引入了塊級作用域。讓我們來看一個具體的例子來詳細分析塊級作用域。
```javascript
function f() { console.log('I am outside!'); }
(function () {
if(false) {
// 重復聲明一次函數f
function f() { console.log('I am inside!'); }
}
f();
}());
```
在ES5環境中,這段代碼將輸出"I am inside!",這個是因為在ES5中,不管代碼塊是否被運行,函數定義都將自動被提升到外部(全局空間)。但是如果在ES6中運行,你將看到輸出"I am outside!",這個是因為重復的function定義是在另外一個不被執行的代碼塊中。實際上在ES6中,上面的代碼被翻譯成了下面的ES5代碼。
```javascript
"use strict";
function sayHello() {
console.log("say hello from global");
}
(function () {
if (false) {
var _sayHello = function _sayHello() {
console.log("say hello from inside");
};
}
sayHello();
})();
```
塊級作用域的另外一個影響就是把變量綁定到了當前的作用域
```javascript
"use strict";
function hello() {
let word = "hello world!";
if (false) {
let word = "hello world1!";
}
console.log(word);
}
hello();//will see "Hello World!"
```
# const命令
const命令和let命令唯一的區別在于constant命令定義的是一個常量。因此使用constant命令定義的常量必須在定義的同時被初始化。
# 引入其他js文件中定義的變量/常量
在ES6中,可以使用import語句來引入其他文件中定義的常量 / 變量。
```javascript
"use strict"
//定義在constants.js的常量
export const HELLO = "hello"
//在其他js中
import * as constants from "./constants.js"
console.log(constants.HELLO)
import {HELLO as myHello} from "./constants.js"
console.log(myHello)
```
# 全局變量的屬性
在ES6中,使用var定義的變量將是全局變量的屬性(window --- 在browser中 or global--在server段代碼中 ),因此可以通過window.<var_name>或者global.<var_name>來訪問。但是在頂層代碼中使用let / constant定義的變量/常量將不是全局變量的屬性。
- Introduction
- Nodejs 4.x新特性
- classes
- typed arrays
- generators
- collections
- Set
- Map
- arrow functions
- block scoping
- template strings
- promises
- symbols
- Koa基礎
- 上下文
- koa-generator
- 安裝
- 創建項目
- 更改視圖模板引擎
- Routes
- HTTP
- Get
- 如何獲取query參數
- 如何獲取params
- Post
- 從post獲取參數
- 標準表單(Post with x-www-form-urlencoded)
- 文件上傳(Post with form-data)
- Post with raw
- 數據庫
- MySQL
- Mongo
- 流程控制
- generator/co
- es6的generator是什么?
- co = generator + promise
- async/await
- promise with bluebird
- 測試
- Mocha
- Supertest
- 部署
- 最佳實踐
- FAQ
- 如何發布本書到git pages
- 如何知道require模塊的用法
- koa中的異常處理