เหตุใดชื่อ 'ให้' จึงถูกเลือกสำหรับการประกาศตัวแปรที่ถูกบล็อกขอบเขตใน JavaScript


306

ฉันเข้าใจว่าเหตุใดจึงvarใช้ชื่อนั้น - เป็นตัวแปรconst- เป็นค่าคงที่ แต่ความหมายเบื้องหลังชื่อletซึ่งมีความหมายต่อบล็อกปัจจุบันคืออะไร ช่างมันเถอะ?


7
พื้นฐานการประดิษฐ์คิดค้นในปี 1962 LETที่ใช้ อาจมีตัวอย่างภาษาก่อนหน้า
David R Tribble

5
พื้นฐานถูกคิดค้นในปี 1964ไม่ใช่ 2505 ดูที่นี่ด้วย การใช้LETอธิบายไว้ในหน้า 7 จากร่างแรกของคู่มือพฤษภาคม 1964 รูปแบบไฟล์ PDF ที่นี่
โจเซฟ Quinsey

โดยเฉพาะอย่างยิ่งconstคือการอ้างอิงวัตถุคงที่หรือไม่เปลี่ยนรูป (อ่านอย่างเดียว) ซึ่งตัววัตถุยังคงไม่แน่นอน เช่น. หลังจากการประกาศ / กำหนดconst foo = ['bar'], foo.push('bat')ยังคงเป็นกฎหมาย แต่foo = ['bar', 'bat']ไม่ได้เป็น แต่มันพิมพ์มากเกินไป
user982671

คำตอบ:


372

ให้เป็นคำสั่งทางคณิตศาสตร์ที่ถูกนำมาใช้โดยภาษาการเขียนโปรแกรมก่อนเช่น Scheme และ Basic ตัวแปรถูกพิจารณาว่าเป็นหน่วยงานระดับต่ำที่ไม่เหมาะสำหรับระดับที่สูงขึ้นของนามธรรมดังนั้นความปรารถนาของนักออกแบบภาษาหลายคนที่จะแนะนำแนวคิดที่คล้ายกัน แต่มีประสิทธิภาพมากกว่าเช่น Clojure, F #, Scala ซึ่งletอาจหมายถึงค่าหรือตัวแปรที่สามารถกำหนดได้ แต่ไม่เปลี่ยนแปลงซึ่งจะทำให้คอมไพเลอร์ตรวจจับข้อผิดพลาดในการเขียนโปรแกรมมากขึ้นและปรับโค้ดให้ดีขึ้น

JavaScript มีvarตั้งแต่ต้นดังนั้นพวกเขาจึงต้องการคำหลักอีกคำและยืมจากภาษาอื่นอีกหลายสิบภาษาที่ใช้letเป็นคำหลักดั้งเดิมที่ใกล้เคียงvarที่สุดเท่าที่จะเป็นไปได้แม้ว่าใน JavaScript letจะสร้างตัวแปรโลคัลบล็อกขอบเขตแทน


94
และหน้าเอกสาร Mozilla อย่างเป็นทางการอ้างอิงหน้านี้สำหรับคำถามนี้developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra

9
นอกจากนี้ยังเป็นสิ่งที่ดีซึ่งlen('var') === len('let')หมายความว่าการประกาศของคุณเข้าแถวในตัวแก้ไขอย่างใดอย่างหนึ่ง ฉันยังไม่พบอะไรเลยที่จะแนะนำสิ่งนี้โดยเจตนา แต่มันอาจเป็นได้) เป็นที่ชื่นชอบทางสายตาและสามารถอ่านได้มากขึ้นหรือ b) น่ารำคาญอย่างมากที่จะทำการดีบั๊กถ้าคุณผสมสอง (ซึ่งดูเหมือนว่าเป็นความคิดที่ไม่ดี เคยเห็นมันทำ)
brichins

13
กล่าวอีกนัยหนึ่งletมีการใช้แบบดั้งเดิมเพื่ออธิบายค่าคงที่เช่นเดียวกับที่let C = the speed of lightJavascript ตัดสินใจใช้ให้เพื่ออธิบายตัวแปรที่มีการกำหนดขอบเขตที่ไม่เป็นมาตรฐานและในเวลาเดียวกันก็แนะนำคำหลักอื่นสำหรับค่าคงที่
fijiaaron

1
ผมไม่เห็นด้วยที่อยู่ใกล้กับlet varสกาล่าไม่ได้ใช้ด้วยletดังนั้นฉันจึงไม่เห็นว่ามันเกี่ยวข้องกันอย่างไร
Aluan Haddad

3
@fijiaaron: การกำหนดขอบเขตที่ไม่เป็นมาตรฐานอย่างไร? ไม่ใช่ฟังก์ชั่นทั้งหมดโดยไม่คำนึงถึงสิ่งที่บล็อกคุณประกาศมันแปลกที่จะเริ่มต้นด้วย?
SamB

78

ฉันคิดว่ามันเป็นไปตามประเพณีทางคณิตศาสตร์ ในคณิตศาสตร์มันมักจะพูดว่า "ให้ x เป็นจำนวนจริงโดยพลการ" หรือเช่นนั้น


ฉันชอบคำตอบนี้มากกว่าเพราะสั้นและมีความสัมพันธ์ค่อนข้างมากเมื่อเราผ่านพีชคณิตแล้วก็ควรอธิบายด้วยคำอธิบายเช่นเดียวกับที่คนอื่น ๆ กำลังชี้
duduwe

69

การเพิ่มการตอบสนองของ exebookนั้นการใช้คำหลักทางคณิตศาสตร์ช่วยให้สามารถสรุปผลการกำหนดขอบเขตletเมื่อใช้ใน Javascript / ES6 ได้ดี โดยเฉพาะเช่นเดียวกับรหัส ES6 ต่อไปนี้จะไม่ทราบได้รับมอบหมายในการจัดฟันของtoPrint เมื่อมันพิมพ์ออกค่าของ'Hello World',

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

ปล่อยให้ใช้ในคณิตศาสตร์อย่างเป็นทางการ (โดยเฉพาะอย่างยิ่งการเขียนบทพิสูจน์) บ่งชี้ว่าอินสแตนซ์ปัจจุบันของตัวแปรมีอยู่สำหรับขอบเขตของความคิดเชิงตรรกะนั้นเท่านั้น ในตัวอย่างต่อไปนี้ x จะได้รับอัตลักษณ์ใหม่ทันทีเมื่อเข้าสู่แนวคิดใหม่ (โดยปกติจะเป็นแนวคิดที่จำเป็นในการพิสูจน์ความคิดหลัก) และแปลงกลับเป็น x เก่าโดยทันทีเมื่อบทสรุปของการพิสูจน์ย่อย แน่นอนเช่นเดียวกับในการเข้ารหัสสิ่งนี้ถือว่าค่อนข้างสับสนและโดยทั่วไปแล้วจะหลีกเลี่ยงได้โดยการเลือกชื่ออื่นสำหรับตัวแปรอื่น

ให้ x เป็นเช่นนั้น ...

  หลักฐานสิ่ง

 ความคิดใหม่ {ให้ x เป็นอย่างอื่น ... พิสูจน์บางสิ่ง} สรุปเอาความคิดใหม่

 พิสูจน์ความคิดหลักด้วย x เก่า


19
ฉันคิดว่ามันมีประโยชน์จริงๆ คำตอบที่ยอมรับนั้นเกือบจะทำให้เข้าใจผิดเล็กน้อยเพราะมันพูดถึงคุณค่าที่ไม่สามารถเปลี่ยนแปลงได้ซึ่งไม่ใช่สิ่งที่letจะเกิดขึ้นเลย letเป็นเรื่องเกี่ยวกับขอบเขต
jinglesthula

แค่ความคิด: letทำให้ฉันคิดว่าบางสิ่งเช่นนี้เกิดขึ้นในใจของผู้เขียนโค้ด "โอเคสำหรับช่วงเวลานี้let foo = barแต่จากนั้นมันสามารถย้อนกลับไปสู่ค่าดั้งเดิมหรือหยุดได้ซึ่งแสดงให้เห็นอย่างเรียบร้อยใน ตัวอย่างสำหรับบล็อกขอบเขตและ Redeclaring ตัวแปรในงานนำเสนอ W3Schoolsของlet. อีกครั้งไม่ได้ทำท่าจะนำคำตอบทางวิทยาศาสตร์ของการจัดเรียงบาง แต่แบ่งปันนี้มากขึ้นเป็นอุปกรณ์ช่วยในการจำจำเมื่อฉันต้องการใช้let.
อแลง

ฉันคิดว่ามันคุ้มค่าที่จะต้องแม่นยำกว่านี้เล็กน้อยเพื่อความชัดเจนของแนวคิด ตัวอย่างรหัส ES6 ของคุณจะไม่ "เพิกเฉยต่อการมอบหมายในวงเล็บ" จะดำเนินการกำหนดตามคำแนะนำบนตัวแปรใหม่toPrintที่มีอยู่ภายในบล็อกเท่านั้นและจากนั้นจะโยนตัวแปรนั้นออกไปตามหน้าที่เมื่อบล็อกสิ้นสุด และเมื่อออกจากเรากลับมาอยู่ในขอบเขตด้านนอกที่ภายในtoPrintไม่มีอยู่แล้วจึงconsole.log(toPrint)หมายถึงด้านนอก toPrintไม่ใช่ว่ามันจะถูกเพิกเฉยมันเป็นเพียงletตัวแปรที่มีระยะเวลา จำกัด ที่กำหนดโดยขอบเขตของมัน
FeRD

1
@ FeRD จุดที่ยอดเยี่ยม ฉันได้ทำการแก้ไขด้านบนเพื่อลบการใช้คำว่า "ไม่สนใจ" เนื่องจากมันทำให้ประเด็นสับสน
Evan White

36

มันทำสิ่งที่varแตกต่างกับขอบเขต ตอนนี้มันไม่สามารถใช้ชื่อvarตั้งแต่ที่มีอยู่แล้ว

ดังนั้นจึงดูเหมือนว่าได้ใช้ชื่อที่ดีที่สุดถัดไปซึ่งมีความหมายในโครงสร้างภาษาอังกฤษที่น่าสนใจ

let myPet = 'dog';

ในภาษาอังกฤษมันพูดว่า "ให้สัตว์เลี้ยงของฉันเป็นสุนัข"


5
ในขณะที่ต้นกำเนิดของการปล่อยให้เป็นภาษาและคณิตศาสตร์การอ้างอิงใกล้บ้านคือไม่ต้องสงสัยคำสั่ง LET ในทุกรุ่นของภาษาการเขียนโปรแกรมขั้นพื้นฐานหนึ่งที่ผู้เขียนหลายคนของ ES6 จะเริ่มเรียนรู้ถ้าพวกเขามากกว่า 40 โย
wide_eyed_pupil

5
@wide_eyed_pupil เพียงแค่ FYI: ในฐานะผู้ที่อายุมากกว่า 40 ปี (แม้ว่าจะไม่ใช่นักเขียนของ ES6) ที่เติบโตมาจาก BASIC ไม่มีชุมชนใดที่ฉันเกี่ยวข้องกับการใช้ LET ในทางปฏิบัติทั่วไป เราเพิ่งกำหนดตัวแปรตามที่ Python ทำตอนนี้ (เช่นA$="HELLO WORLD") ล่ามที่เกี่ยวข้องรวมถึง Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 บน CP / M, Applesoft BASIC และแม้แต่ BASCOM, MS BASIC compiler บน CP / M VAX BASIC มี LET แต่ไม่ต้องการมันอย่างที่ฉันจำได้ หน่วยความจำกลับมาคับและตัวอักษรพิเศษของโปรแกรม 3 หรือ 4 ข้อความต่อคำสั่งสร้างความแตกต่างโดยเฉพาะในโปรแกรม "ใหญ่"
Peter Hull

@PeterHull น่าสนใจฉันได้ทำการเข้ารหัสครั้งแรกกับการ์ดที่ทำเครื่องหมายด้วยดินสอซึ่งติดอยู่กับ Digital CPU จากนั้น mainframes ที่ห้องปฏิบัติการวิจัยของชายชราและ Digital PDP8 ที่โรงเรียน ไม่เคยเห็นคนใช้ LET โดยไม่ใช้ข้อความจริงไม่ใช่ในหนังสือที่ฉันอ่านเช่นกัน โปรดทราบว่าฉันได้รับการสนับสนุนให้เขียนโค้ดใน FORTRAN และ PASCAL ทันทีที่ฉันได้รับสิ่งที่ดีความเป็นอยู่พื้นฐานที่แย่อย่างที่เคยเป็นมาแม้จะไม่มี GOSUB (เช่นฟังก์ชั่นที่ใช้ซ้ำได้) ในรุ่นที่ฉันใช้
wide_eyed_pupil

คุณไม่สามารถประกาศตัวแปร let อีกครั้ง
CONVID19

10

ความเป็นไปได้ที่น่าจะเป็นไปได้มากที่สุดก็คือ ไม่เพียง แต่จะพูดง่าย แต่เข้าใจง่าย บางคนอาจเถียงมากกว่าvarนั้น

แต่ฉันคิดว่ามันมีประวัติมากกว่านี้

จากWikipedia :

ภาษา LCF ของ Dana Scott เป็นขั้นตอนในวิวัฒนาการแคลคูลัสแลมบ์ดาเป็นภาษาที่ใช้งานได้ ภาษานี้นำเสนอการแสดงออกให้ซึ่งปรากฏในภาษาที่ใช้งานได้มากที่สุดตั้งแต่เวลานั้น

ภาษาที่บังคับใช้โดยรัฐเช่น ALGOL และ Pascal ใช้การแสดงออกของ let เป็นหลักเพื่อใช้ขอบเขตของฟังก์ชันที่ จำกัด ในโครงสร้างบล็อก

ฉันต้องการเชื่อว่านี่เป็นแรงบันดาลใจเช่นกันสำหรับletใน Javascript


คำตอบนี้หมายถึงแคลคูลัสแลมบ์ดา 'ให้แสดงออก' ซึ่งอาจไม่ใช่สิ่งที่ OP ถาม และดูเหมือนจะช้ากว่าLETใน BASIC จากปี 1964
โจเซฟควินซี

บทความทั้งหมดนั้นเป็นหนึ่งในหลาย ๆ เล่มที่เขียนโดยผู้ใช้ Wikipedia Thepigdog ย้อนกลับไปในปี 2014 ฉันจะเป็นคนรอบคอบและเพิ่งพูดว่าพวกเขาทั้งหมดถูกเขียนจากมุมมองที่แคบมากดังนั้นการอ้างสิทธิ์ที่อ้างถึงอย่างเต็มที่ ตีความว่าคำพูดของกระดาษของสกอตต์ "แนะนำ" การแสดงออกให้กับแคลคูลัสแลมบ์ดาในลักษณะเดียวกับที่ ES6 แนะนำletให้ใช้กับ JavaScript ไม่จริงอย่างสิ้นเชิงตราบใดที่มันไป แต่ไม่มีความสำคัญจริง ๆ (และไม่ได้อยู่ในทางใดทางปกครองออกเป็นไปได้ว่าการใช้สกอตต์ของ "ให้" เป็นยังแรงบันดาลใจจากพื้นฐานLET.)
FeRD

1

อนุญาตให้ใช้ขอบเขตที่ จำกัด ในระดับบล็อกเพิ่มเติมในขณะที่ var คือขอบเขตฟังก์ชันหรือขอบเขตส่วนกลางโดยทั่วไป

ดูเหมือนว่าจะมีการเลือกให้มากที่สุดเนื่องจากพบในภาษาอื่น ๆ มากมายเพื่อกำหนดตัวแปรเช่น BASIC และอื่น ๆ อีกมากมาย


1

ฉันคิดว่าเป็นหนี้บุญคุณของ JavaScript เพื่อ Scheme ชัดเจนที่นี่ โครงการไม่เพียง แต่มีการปล่อยให้ แต่มีการให้ *, ให้ * - ค่า, let-syntax และ let-values (ดูภาษาโปรแกรม The Scheme, 4th Ed.)

((ตัวเลือกเพิ่มความเชื่อมั่นเพิ่มเติมต่อความคิดที่ว่า JavaScript คือ Lispy แต่ - ก่อนที่เราจะถูกพาไป - ไม่ใช่ homoiconic)))


1

มันอาจหมายถึงบางอย่างเช่น "Lexical Environment Type หรือ Tied" .. มันทำให้ฉันรำคาญใจว่ามันจะเป็น "ปล่อยให้มันเป็นอย่างนั้น " และให้ REC ไม่เข้าท่าในแคลคูลัสแลมบ์ดา


ฉันกำลังมองหาคำตอบเช่นนี้ฉันก็สงสัยว่ามันมีความหมายทั่วไปของภาษาอังกฤษว่า "ให้"
Meenohara
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.