Tại sao tên 'let' được chọn cho khai báo biến trong phạm vi khối trong JavaScript?


306

Tôi hiểu tại sao lại varlấy tên đó - nó là biến, const- nó là một hằng số, nhưng ý nghĩa đằng sau tên letđó là gì, phạm vi của khối hiện tại là gì? Để cho nó được?


7
BASIC , được phát minh vào năm 1962, được sử dụng LET. Có thể có các ví dụ ngôn ngữ trước đó.
David R Tribble

5
BASIC được phát minh vào năm 1964 , không phải năm 1962. Xem thêm tại đây . Việc sử dụng LETđược mô tả trên trang 7 của bản thảo đầu tiên của hướng dẫn sử dụng, ngày 5 tháng 5 năm 1964, pdf tại đây .
Joseph Quinsey 27/03/18

Cụ thể hơn constlà một tham chiếu đối tượng không đổi, hoặc bất biến (chỉ đọc) trong đó bản thân đối tượng vẫn có thể thay đổi. Ví dụ. Sau khi khai báo / chuyển nhượng const foo = ['bar'], foo.push('bat')vẫn sẽ hợp pháp, nhưng foo = ['bar', 'bat']không phải. Nhưng đó là quá nhiều gõ.
dùng982671

Câu trả lời:


372

Let là một tuyên bố toán học đã được thông qua bởi các ngôn ngữ lập trình ban đầu như Scheme và Basic. Các biến được coi là các thực thể cấp thấp không phù hợp với mức độ trừu tượng cao hơn, do đó mong muốn của nhiều nhà thiết kế ngôn ngữ giới thiệu các khái niệm tương tự nhưng mạnh hơn như trong Clojure, F #, Scala, trong đó letcó thể có nghĩa là một giá trị hoặc một biến có thể được gán, nhưng không thay đổi , điều này cho phép trình biên dịch bắt được nhiều lỗi lập trình hơn và tối ưu hóa mã tốt hơn.

JavaScript đã có vartừ đầu, vì vậy họ chỉ cần một từ khóa khác và chỉ cần mượn từ hàng tá ngôn ngữ khác letđã sử dụng như một từ khóa truyền thống càng gần varcàng tốt, mặc dù trong JavaScript lettạo ra biến cục bộ phạm vi thay thế.


94
Và trang Tài liệu Mozilla chính thức trích dẫn trang này cho câu hỏi này developer.mozilla.org/en/docs/Web/JavaScript/Reference/
Kẻ

9
Điều đó cũng tốt len('var') === len('let'), có nghĩa là các tuyên bố của bạn xếp hàng độc đáo trong trình soạn thảo của bạn. Tôi chưa tìm thấy bất cứ điều gì cho thấy điều này là có chủ ý, nhưng nó có thể là một) dễ chịu về mặt trực quan và dễ đọc hơn, hoặc b) gây khó chịu khủng khiếp để gỡ lỗi nếu bạn kết hợp cả hai (có vẻ như đó là một ý tưởng tồi, nhưng tôi đã thấy nó được thực hiện).
brichin

13
Nói cách khác, lettheo truyền thống được sử dụng để mô tả một hằng số, let C = the speed of lightvì vậy Javascript đã quyết định sử dụng let để mô tả một biến có phạm vi không chuẩn và đồng thời giới thiệu một từ khóa khác cho các hằng số.
fijiaaron

1
Tôi không đồng ý rằng letgần var. Ngoài ra Scala không sử dụng letvì vậy tôi không thấy nó có liên quan như thế nào.
Aluan Haddad

3
@fijiaaron: Phạm vi không chuẩn như thế nào? Không phải là toàn bộ chức năng-bất kể-của-những gì-khối-bạn-đã-khai-nó-trong loại kỳ lạ để bắt đầu?
SamB

78

Tôi đoán nó theo truyền thống toán học. Trong toán học, người ta thường nói "hãy x là số thực tùy ý" hoặc như thế.


Tôi thích câu trả lời này hơn vì nó ngắn gọn và khá dễ hiểu vì tất cả chúng ta đều đã trải qua đại số, sau đó có lẽ nên được theo sau bởi lời giải thích như những gì những người khác đang chỉ ra.
duduwe

69

Thêm vào phản hồi của exebook , việc sử dụng toán học của từ khóa cũng cho phép gói gọn các hàm ý phạm vi letkhi được sử dụng trong Javascript / ES6. Cụ thể, giống như mã ES6 sau đây không biết về phép gán trong dấu ngoặc nhọn toPrint khi nó in ra giá trị của 'Hello World',

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

hãy để như được sử dụng trong toán học chính thức (đặc biệt là viết bằng chứng) chỉ ra rằng trường hợp hiện tại của một biến chỉ tồn tại cho phạm vi của ý tưởng logic đó. Trong ví dụ sau, x ngay lập tức nhận được một danh tính mới khi nhập ý tưởng mới (thường đây là những khái niệm cần thiết để chứng minh ý chính) và ngay lập tức trở lại x cũ khi kết thúc bằng chứng phụ. Tất nhiên, giống như trong mã hóa, điều này được coi là hơi khó hiểu và vì vậy thường được tránh bằng cách chọn một tên khác cho biến khác.

Đặt x là như vậy và ...

  Bằng chứng

 Ý tưởng mới {Hãy x là một cái gì đó khác ... chứng minh điều gì đó} Kết luận về ý tưởng mới

 Chứng minh ý chính với x cũ


19
Tôi nghĩ rằng điều này thực sự hữu ích. Câu trả lời được chấp nhận gần như là một chút sai lầm, vì nó nói về giá trị không thể thay đổi, đó không phải letlà những gì về tất cả. letlà tất cả về phạm vi.
jinglểula

Chỉ là một suy nghĩ: letlàm cho tôi nghĩ về một cái gì đó như thế này đang diễn ra trong tâm trí của người viết mã, "Ok, chỉ trong khoảnh khắc này let foo = bar, nhưng sau đó nó có thể quay trở lại giá trị ban đầu hoặc chấm dứt. Điều này được minh họa gọn gàng trong các ví dụ về Phạm vi khối và Biến số khai báo trong bản trình bày của W3Schools nàylet . Một lần nữa, không giả vờ đưa ra một câu trả lời khoa học nào đó, nhưng chia sẻ nó nhiều hơn như một thiết bị ghi nhớ để tôi nhớ khi sử dụng let.
Alain

Tôi nghĩ rằng nó đáng để chính xác hơn một chút ở đây, vì lợi ích của sự rõ ràng về khái niệm. Mã ES6 ví dụ của bạn không "bỏ qua việc gán trong dấu ngoặc nhọn". Nó thực hiện nhiệm vụ theo hướng dẫn, trên một biến mớitoPrint chỉ tồn tại trong khối , và sau đó ném mạnh biến đó đi khi khối kết thúc. Và khi thoát ra, chúng ta trở lại phạm vi bên ngoài, nơi bên trong toPrintkhông còn tồn tại, vì vậy console.log(toPrint)đề cập đến bên ngoài toPrint . Không phải là bất cứ điều gì bị bỏ qua, chỉ là letcác biến có vòng đời hữu hạn được xác định bởi phạm vi của chúng.
FeRD

1
@FeRD, điểm tuyệt vời. Tôi đã thực hiện một chỉnh sửa ở trên để loại bỏ việc sử dụng từ "bỏ qua" vì nó làm xáo trộn quan điểm.
Evan White

36

Nó thực hiện chính xác những gì varlàm với một sự khác biệt phạm vi. Bây giờ nó không thể lấy tên varvì nó đã được thực hiện.

Vì vậy, có vẻ như nó đã lấy tên tốt nhất tiếp theo có ngữ nghĩa trong một cấu trúc ngôn ngữ tiếng Anh thú vị.

let myPet = 'dog';

Trong tiếng Anh có câu "Hãy để thú cưng của tôi là một con chó"


5
Mặc dù nguồn gốc của let có thể là ngôn ngữ và toán học, nhưng tài liệu tham khảo gần nhà chắc chắn là tuyên bố LET trong tất cả các phiên bản của ngôn ngữ lập trình BASIC, một trong số nhiều tác giả của ES6 đã bắt đầu học nếu họ kết thúc 40 yo.
wide_eyed_pupil

5
@ Worldwide_eyed_pupil Chỉ cần FYI: là một người ngoài 40 tuổi (mặc dù không phải là tác giả của ES6) lớn lên trên BASIC, không có cộng đồng nào tôi tham gia với LET được sử dụng trong thực tế chung; chúng tôi chỉ gán các biến, như Python hiện tại (ví dụ A$="HELLO WORLD") Các trình thông dịch có liên quan bao gồm Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 trên CP / M, Applesoft BASIC và thậm chí BASCOM, trình biên dịch MS BASIC trên CP / M. VAX BASIC đã có LET, nhưng tôi không yêu cầu, như tôi nhớ. Bộ nhớ hồi đó rất chặt và 3 hoặc 4 ký tự phụ của văn bản chương trình cho mỗi câu lệnh đã tạo ra sự khác biệt, đặc biệt là trong các chương trình "lớn".
Peter Hull

@PeterHull Thật thú vị, tôi đã thực hiện mã hóa đầu tiên của mình trên các thẻ được đánh dấu bằng bút chì gắn với CPU kỹ thuật số, sau đó là máy tính lớn tại phòng thí nghiệm nghiên cứu của ông già và PDP8 kỹ thuật số ở trường. chưa bao giờ một lần người ta sử dụng LET mà không thực sự sử dụng câu lệnh, không phải trong những cuốn sách tôi đọc. Nhắc bạn, tôi được khuyến khích viết mã trong FORTRAN và PASCAL ngay khi tôi nhận được bất kỳ điều tốt, cơ bản nào tệ như vậy, thậm chí không có GOSUB (tức là các chức năng có thể sử dụng lại) trong các phiên bản tôi đã sử dụng.
wide_eyed_pupil

Bạn không thể xác định lại một biến cho phép.
CONvid19 ngày

10

Khả năng cao nhất là nó là sự lựa chọn thành ngữ nhất. Không chỉ dễ nói, mà còn trực quan để hiểu. Một số có thể tranh luận, thậm chí nhiều hơn var.

Nhưng tôi nghĩ có thêm một chút lịch sử cho việc này.

Từ Wikipedia :

Ngôn ngữ LCF của Dana Scott là một giai đoạn trong quá trình phát triển tính toán lambda thành các ngôn ngữ chức năng hiện đại. Ngôn ngữ này đã giới thiệu biểu thức let, xuất hiện trong hầu hết các ngôn ngữ chức năng kể từ thời điểm đó.

Các ngôn ngữ mệnh lệnh đầy đủ trạng thái như ALGOL và Pascal về cơ bản thực hiện một biểu thức let, để thực hiện phạm vi hàm bị hạn chế, trong các cấu trúc khối.

Tôi cũng muốn tin rằng đây cũng là một nguồn cảm hứng cho letJavascript.


Câu trả lời này đề cập đến phép tính lambda 'let biểu thức', có lẽ không phải là những gì OP yêu cầu. Và nó xuất hiện muộn hơn LETtrong BASIC, từ năm 1964.
Joseph Quinsey 27/03/18

Toàn bộ bài viết đó là một trong số một bài viết về cơ bản được viết một lần bởi người dùng Wikipedia Thepigdog vào năm 2014. Tôi sẽ thận trọng và chỉ nói rằng tất cả chúng được viết từ một quan điểm rất hẹp, do đó, yêu cầu (hoàn toàn không được ước tính) được trích dẫn nên được trích dẫn giải thích như nói rằng bài báo của Scott "giới thiệu" biểu thức let cho phép tính lambda , giống như cách ES6 đã giới thiệu letvới JavaScript. Không hoàn toàn sai sự thật, theo như nó đi, nhưng không có bất kỳ ý nghĩa thực sự. (Và không phải trong bất kỳ cách nào loại trừ khả năng Scott sử dụng "cho phép" cũng được lấy cảm hứng từ BASIC LET.)
FeRD

1

Hãy sử dụng phạm vi giới hạn mức khối ngay lập tức hơn trong khi var là phạm vi chức năng hoặc phạm vi toàn cầu thường.

Dường như let được chọn nhiều nhất vì nó được tìm thấy trong rất nhiều ngôn ngữ khác để định nghĩa các biến, chẳng hạn như BASIC và nhiều ngôn ngữ khác.


1

Tôi nghĩ rằng sự mắc nợ của JavaScript đối với Đề án là rõ ràng ở đây. Lược đồ không chỉ có let, mà còn let *, let * -values, let-Cú pháp và let-value. (Xem, Ngôn ngữ lập trình lược đồ, Ed 4).

((Sự lựa chọn làm tăng thêm sự tin cậy cho khái niệm rằng JavaScript là Lispy, nhưng - trước khi chúng ta bị mang đi - không phải là đồng âm.))))


1

Nó cũng có thể có nghĩa gì đó như "Loại môi trường từ điển hoặc bị trói" .. Điều đó làm phiền tôi rằng nó chỉ đơn giản là "hãy để như thế ". Và hãy để rec không có ý nghĩa trong tính toán lambda.


Tôi đang tìm kiếm một câu trả lời như thế này Tôi quá nghi ngờ nó có nghĩa tiếng Anh chung là "hãy"
Meenohara
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.