我明白爲什麼var
取這個名字 - 它是可變的,const
- 它是一個常數,但let
的名稱背後的含義是什麼?隨它去?爲什麼在JavaScript中選擇'let'作爲塊範圍變量聲明?
回答
令是通過了類似方案和基本的早期編程語言的數學聲明。變量被認爲是低層次的實體,不適合更高的抽象層次,因此很多語言設計者希望引入類似但更強大的概念,如Clojure,F#,Scala,其中let
可能意味着一個值,或者可能是變量分配,但不會改變,這反過來又讓編譯器捕獲更多編程錯誤並更好地優化代碼。 JavaScript從一開始就有var
,所以他們只需要另一個關鍵字,並且只是從幾十種其他語言中借用了let
作爲傳統關鍵字,儘可能接近var
,儘管在JavaScript let
中創建了塊範圍局部變量。
很好解釋。 – gani
官方的Mozilla文檔頁面引用了這個頁面的這個問題https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let – SarathChandra
這也很好'len('var')== = len('let')',這意味着你的聲明以任何方式在編輯器中很好地排列。我還沒有發現任何東西還沒有表明這是故意的,但它可以是a)視覺上令人愉悅且更易讀,或b)如果混合使用這兩者(這似乎是一個糟糕的主意,但我'已經看到它完成了)。 – brichins
我想它遵循數學傳統。在數學中,人們常說「讓x是任意的實數」或類似的。
它確實是var
與範圍差異所做的。現在它不能取名爲var
,因爲它已經被使用了。
所以它看起來已經採取了下一個最好的名字,它在一個有趣的英語語言結構中具有語義。
let myPet = 'dog';
在英語中,它說:「讓我的寵物是一隻狗」
儘管let的起源可能是語言學和數學,但近親參考無疑是所有BASIC編程語言版本中的LET語句,許多ES6的作者會開始學習,如果他們是超過40歲。 –
@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個額外字符都有所不同,特別是在「大」程序中。 –
@PeterHull這很有趣,我在附有數字CPU的鉛筆標記卡上做了我的第一個編碼,然後是老人研究實驗室的大型機和學校的數字PDP8。從來沒有人看到人們在沒有實際使用陳述的情況下使用LET,而不是在我閱讀的書籍中。請注意,只要我有任何好的,基本的存在就像我一樣糟糕,甚至在我使用的版本中沒有GOSUB(即可重用函數),我都會被鼓勵在FORTRAN和PASCAL中編碼。 –
最有可能的是它是最習慣的選擇。不僅說話容易,而且直觀易懂。有些人可能會說,甚至比var
還要多。
但我估計還有更多的歷史。
維基百科:
達納·斯科特的LCF語言在演算演變成現代的函數式語言的階段。這種語言引入了let表達式,從那時起,它已經出現在大多數函數式語言中。
ALGOL和Pascal等全狀態命令式語言實質上實現了一個let表達式,以在塊結構中實現受限範圍的函數。
我想相信這也是一個靈感,在JavaScript中爲let
。
添加到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
我認爲這非常有用。被接受的答案几乎有點誤導,因爲它談論的是價值無法改變,而這根本不是「讓」。 「讓」是關於範圍的。 – jinglesthula
讓我們使用更直接的塊級限制範圍,而var通常是函數範圍或全局範圍。
看起來我們被選中的原因很多,因爲它在許多其他語言中被用來定義變量,比如BASIC和其他許多語言。
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
}
- 1. 範圍JavaScript變量的聲明爲inline
- 2. javascript函數範圍,變量聲明
- 3. Javascript變量聲明和範圍
- 4. 聲明變量和範圍
- 5. 在java中的靜態塊中聲明變量的範圍是什麼?
- 6. 在「for」條件中聲明的變量的範圍是什麼?
- 7. 爲什麼變量不在範圍內?
- 8. 爲什麼要爲變量「let」賦值?
- 9. 爲什麼在其他情況下在一個case聲明中聲明的變量在範圍內?
- 10. 爲什麼建議在聲明變量時儘可能使用最窄範圍?
- 11. 困惑,爲什麼C++全局變量未在此範圍內聲明
- 12. 爲什麼將變量聲明的範圍限制在所需的最小值?
- 13. Javascript變量範圍行爲
- 14. 爲什麼變量在Javascript中的函數之前聲明
- 15. 爲什麼在Javascript中包含變量聲明for循環?
- 16. 爲什麼jslint喜歡在JavaScript中分割變量聲明?
- 17. 爲什麼在javascript中留下一個未聲明的變量?
- 18. 在javascript中爲什麼我們使用var來聲明變量?
- 19. 變量未在範圍內聲明
- 20. 變量未在此範圍內聲明?
- 21. 「變量」未在此範圍內聲明
- 22. 爲什麼變量超出範圍?
- 23. 在聲明中聲明的變量未在類範圍中聲明
- 24. 變量聲明:爲什麼接口
- 25. 爲什麼我得到錯誤無法在TypeScript中重新聲明塊範圍變量'name'
- 26. 局部變量名爲'myList'不能在此範圍內聲明
- 27. 爲什麼這個javascript值在它聲明的範圍內爲null,但不在一個較窄的範圍內
- 28. 在javascript中禁止變量的範圍(不使用let)
- 29. 我不明白爲什麼我的變量超出範圍
- 30. 爲什麼我們在java中聲明變量爲private
[BASIC](https://en.wikipedia.org/wiki/BASIC),發明於1962年,使用'LET'。可能有更早的語言示例。 –