เหตุผลที่คุณเห็นปัญหาเช่นนี้คือคอนโซลพยายามเลียนแบบขอบเขตทั่วโลกของบริบทที่คุณกำลังกำหนดเป้าหมายในปัจจุบัน นอกจากนี้ยังพยายามจับค่าส่งคืนจากคำสั่งและนิพจน์ที่คุณเขียนในคอนโซลเพื่อให้แสดงเป็นผลลัพธ์ ยกตัวอย่างเช่น
> 3 + 2
< 5
ที่นี่มันดำเนินการราวกับว่ามันเป็นนิพจน์ แต่คุณเขียนมันราวกับว่ามันเป็นคำสั่ง ในสคริปต์ปกติค่าจะถูกทิ้ง แต่ที่นี่รหัสจะต้องมีการจัดการภายใน (เช่นการตัดคำสั่งทั้งหมดด้วยบริบทของฟังก์ชั่นและreturn
คำสั่ง) ซึ่งทำให้เกิดเอฟเฟกต์แปลก ๆ รวมถึงปัญหาที่คุณประสบ
นี่เป็นหนึ่งในสาเหตุที่รหัส ES6 เปลือยในสคริปต์ทำงานได้ดี แต่ไม่ได้อยู่ในคอนโซล Chrome Dev Tools
ลองดำเนินการนี้ใน Node และคอนโซล Chrome:
{ let a = 3 }
ในโหนดหรือ<script>
แท็กมันทำงานได้ดี Uncaught SyntaxError: Unexpected identifier
แต่ในคอนโซลจะช่วยให้ นอกจากนี้ยังให้ลิงก์ไปยังแหล่งข้อมูลในรูปแบบVMxxx:1
ที่คุณสามารถคลิกเพื่อตรวจสอบแหล่งที่ได้รับการประเมินซึ่งแสดงเป็น:
({ let a = 3 })
แล้วทำไมมันถึงทำเช่นนี้?
คำตอบคือต้องการแปลงรหัสของคุณเป็นนิพจน์เพื่อให้สามารถส่งคืนผลลัพธ์ไปยังผู้โทรและแสดงในคอนโซล คุณสามารถทำได้โดยการห่อคำสั่งในวงเล็บซึ่งทำให้มันเป็นนิพจน์ แต่มันก็ทำให้บล็อกข้างต้นไม่ถูกต้อง syntactically (การแสดงออกไม่สามารถมีการประกาศบล็อก)
คอนโซลพยายามแก้ไขกรณีขอบเหล่านี้ด้วยการฉลาดเกี่ยวกับรหัส แต่นั่นก็เกินขอบเขตของคำตอบนี้ฉันคิดว่า คุณสามารถยื่นข้อบกพร่องเพื่อดูว่าเป็นสิ่งที่พวกเขาต้องการพิจารณาแก้ไขหรือไม่
นี่เป็นตัวอย่างที่ดีของบางสิ่งที่คล้ายกันมาก:
https://stackoverflow.com/a/28431346/46588
วิธีที่ปลอดภัยที่สุดในการทำให้โค้ดของคุณทำงานได้คือตรวจสอบให้แน่ใจว่าสามารถรันเป็นนิพจน์และตรวจสอบSyntaxError
ลิงก์ซอร์สเพื่อดูว่าโค้ดการประมวลผลที่แท้จริงคืออะไรและทำวิศวกรรมย้อนกลับโซลูชันจากสิ่งนั้น โดยปกติจะหมายถึงวงเล็บที่วางไว้อย่างเป็นกลยุทธ์
กล่าวโดยย่อ:คอนโซลพยายามจำลองบริบทการดำเนินการทั่วโลกอย่างแม่นยำที่สุด แต่เนื่องจากข้อ จำกัด ของการโต้ตอบกับเอ็นจิ้น v8 และความหมายของ JavaScript บางครั้งก็ยากหรือแก้ไม่ได้