2016-06-20 49 views

回答

207

令是通過了類似方案和基本的早期編程語言的數學聲明。變量被認爲是低層次的實體,不適合更高的抽象層次,因此很多語言設計者希望引入類似但更強大的概念,如Clojure,F#,Scala,其中let可能意味着一個值,或者可能是變量分配,但不會改變,這反過來又讓編譯器捕獲更多編程錯誤並更好地優化代碼。 JavaScript從一開始就有var,所以他們只需要另一個關鍵字,並且只是從幾十種其他語言中借用了let作爲傳統關鍵字,儘可能接近var,儘管在JavaScript let中創建了塊範圍局部變量。

+3

很好解釋。 – gani

+25

官方的Mozilla文檔頁面引用了這個頁面的這個問題https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let – SarathChandra

+2

這也很好'len('var')== = len('let')',這意味着你的聲明以任何方式在編輯器中很好地排列。我還沒有發現任何東西還沒有表明這是故意的,但它可以是a)視覺上令人愉悅且更易讀,或b)如果混合使用這兩者(這似乎是一個糟糕的主意,但我'已經看到它完成了)。 – brichins

49

我想它遵循數學傳統。在數學中,人們常說「讓x是任意的實數」或類似的。

29

它確實是var與範圍差異所做的。現在它不能取名爲var,因爲它已經被使用了。

所以它看起來已經採取了下一個最好的名字,它在一個有趣的英語語言結構中具有語義。

let myPet = 'dog'; 

在英語中,它說:「讓我的寵物是一隻狗」

+3

儘管let的起源可能是語言學和數學,但近親參考無疑是所有BASIC編程語言版本中的LET語句,許多ES6的作者會開始學習,如果他們是超過40歲。 –

+3

@wide_eyed_pupil僅供參考:作爲BASIC成長的40歲以上(儘管不是ES6的作者),我參與過的所有社區都沒有使用過LET;我們剛剛爲Python分配了變量(例如'A $ =「HELLO WORLD」')。所涉及的譯員包括Rockwell AIM 65 BASIC,Atari Basic,CP/M上的MBASIC 5,Applesoft BASIC,甚至BASCOM,MS BASIC編譯器在CP/M上。據我所知,VAX BASIC確實有LET,但並不需要它。當時內存很緊張,每個語句的程序文本的3或4個額外字符都有所不同,特別是在「大」程序中。 –

+0

@PeterHull這很有趣,我在附有數字CPU的鉛筆標記卡上做了我的第一個編碼,然後是老人研究實驗室的大型機和學校的數字PDP8。從來沒有人看到人們在沒有實際使用陳述的情況下使用LET,而不是在我閱讀的書籍中。請注意,只要我有任何好的,基本的存在就像我一樣糟糕,甚至在我使用的版本中沒有GOSUB(即可重用函數),我都會被鼓勵在FORTRAN和PASCAL中編碼。 –

8

最有可能的是它是最習慣的選擇。不僅說話容易,而且直觀易懂。有些人可能會說,甚至比var還要多。

但我估計還有更多的歷史。

維基百科:

達納·斯科特的LCF語言在演算演變成現代的函數式語言的階段。這種語言引入了let表達式,從那時起,它已經出現在大多數函數式語言中。

ALGOL和Pascal等全狀態命令式語言實質上實現了一個let表達式,以在塊結構中實現受限範圍的函數。

我想相信這也是一個靈感,在JavaScript中爲let

26

添加到exebook's response,關鍵字的數學使用讓在Javascript/ES6使用時也封裝很好的let作用域影響。具體而言,正如以下ES6代碼忽略的toPrint括號中的分配,並打印出'Hello World'的值:如在正式數學(特別是證明的寫入)用於

let toPrint = 'Hello World.'; 
{ 
    let toPrint = 'Goodbye World.'; 
} 
console.log(toPrint); // Prints 'Hello World' 

指示當前實例的變量只存在於該邏輯思想的範圍內。在下面的例子中,x在輸入新想法時立即獲得新的身份(通常這些是證明主要想法所必需的概念),並在分證結束時立即恢復到舊的x。當然,就像在編碼中一樣,這被認爲有些混亂,所以通常通過爲其他變量選擇不同的名稱來避免。

設x某某...

 證明的東西

 新思路{設x是別的東西......證明什麼}簽訂新的理念

 用老x證明主意x

+4

我認爲這非常有用。被接受的答案几乎有點誤導,因爲它談論的是價值無法改變,而這根本不是「讓」。 「讓」是關於範圍的。 – jinglesthula

0

讓我們使用更直接的塊級限制範圍,而var通常是函數範圍或全局範圍。

看起來我們被選中的原因很多,因爲它在許多其他語言中被用來定義變量,比如BASIC和其他許多語言。

1

let聲明的變量的作用範圍是它們被定義的區塊,以及任何包含的子區塊。這樣,讓我們​​非常喜歡var。主要區別在於var變量的範圍是整個封閉函數。看到下面的一些例子。

function varTest() { 
    var x = 1; 
    if (true) { 
    var x = 2; // same variable! 
    console.log(x); // 2 
    } 
    console.log(x); // 2 
} 

function letTest() { 
    let x = 1; 
    if (true) { 
    let x = 2; // different variable 
    console.log(x); // 2 
    } 
    console.log(x); // 1 
} 
相關問題