2015-09-14 90 views
81

假設我有一個要導出的變量。什麼是VSJavascript ES6導出常量vs導出let

export let a = 1; 

我明白constlet的區別

export const a = 1; 

之間的區別,但是當你導出它們,有什麼區別?

+0

'export'關鍵字的詳細信息(這裏)(https://developer.mozilla.org/en/docs/web/javascript/reference/statements/export)。目前,任何網絡瀏覽器本身都不支持它。 – RBT

回答

131

在ES6中,import s是對導出值的實時只讀視圖。因此,當您執行import a from "somemodule";時,無論您在模塊中如何聲明a,都不能指定給a

但是,由於導入的變量爲視圖,它們會根據導出中的「原始」導出變量進行更改。考慮下面的代碼(從下面的參考文章借用):

//------ lib.js ------ 
export let counter = 3; 
export function incCounter() { 
    counter++; 
} 

//------ main1.js ------ 
import { counter, incCounter } from './lib'; 

// The imported value `counter` is live 
console.log(counter); // 3 
incCounter(); 
console.log(counter); // 4 

// The imported value can’t be changed 
counter++; // TypeError 

正如你所看到的,差別真的在於lib.js,不main1.js


總結:

  • 您不能分配到import -ed變量,不管你怎麼在模塊中聲明相應的變量。
  • 傳統的let -vs- const語義適用於模塊中聲明的變量。
    • 如果該變量被宣佈爲const,它不能在任何地方重新分配或反彈。
    • 如果變量聲明爲let,則只能在模塊中重新分配該變量(但不能在用戶中重新分配)。如果更改,則import -ed變量會相應更改。

參考: http://exploringjs.com/es6/ch_modules.html#leanpub-auto-in-es6-imports-are-live-read-only-views-on-exported-values

2

我認爲,一旦你導入它,行爲是相同的(在變量將被用於源文件之外的地方)。

唯一的區別是如果您嘗試在此文件結束之前重新分配它。