Lý do bạn gặp vấn đề như thế này là do chính bàn điều khiển cố gắng mô phỏng phạm vi toàn cầu của bối cảnh bạn hiện đang nhắm mục tiêu. Nó cũng cố gắng nắm bắt các giá trị trả về từ các câu lệnh và biểu thức bạn viết trong bảng điều khiển, để hiển thị dưới dạng kết quả. Lấy ví dụ:
> 3 + 2
< 5
Ở đây, nó thực thi như thể nó là một biểu thức, nhưng bạn đã viết nó như thể đó là một tuyên bố. Trong các tập lệnh thông thường, giá trị sẽ bị loại bỏ, nhưng ở đây, mã phải được xử lý bên trong (như bao bọc toàn bộ câu lệnh với ngữ cảnh hàm và return
câu lệnh), gây ra tất cả các loại hiệu ứng kỳ lạ, bao gồm cả các vấn đề bạn gặp phải.
Đây cũng là một trong những lý do khiến một số mã ES6 trần trong các tập lệnh hoạt động tốt nhưng không có trong bảng điều khiển Chrome Dev Tools.
Hãy thử thực hiện điều này trong bảng điều khiển Node và Chrome:
{ let a = 3 }
Trong Node hoặc một <script>
thẻ nó hoạt động tốt, nhưng trong giao diện điều khiển, nó mang lại Uncaught SyntaxError: Unexpected identifier
. Nó cũng cung cấp cho bạn một liên kết đến nguồn dưới dạng VMxxx:1
mà bạn có thể nhấp để kiểm tra nguồn được đánh giá, hiển thị dưới dạng:
({ let a = 3 })
Vậy tại sao nó làm điều này?
Câu trả lời là nó cần chuyển đổi mã của bạn thành một biểu thức để kết quả có thể được trả về cho người gọi và hiển thị trong bảng điều khiển. Bạn có thể làm điều này bằng cách gói câu lệnh trong ngoặc đơn, làm cho nó là một biểu thức, nhưng nó cũng làm cho khối ở trên cú pháp không chính xác (một biểu thức không thể có khai báo khối).
Bảng điều khiển đã cố gắng khắc phục các trường hợp cạnh này bằng cách thông minh về mã, nhưng điều đó vượt quá phạm vi của câu trả lời này, tôi nghĩ vậy. Bạn có thể gửi một lỗi để xem nếu đó là một cái gì đó họ sẽ xem xét sửa chữa.
Đây là một ví dụ tốt về một cái gì đó rất giống nhau:
https://stackoverflow.com/a/28431346/46588
Cách an toàn nhất để làm cho mã của bạn hoạt động là đảm bảo nó có thể được chạy như một biểu thức và kiểm tra SyntaxError
liên kết nguồn để xem mã thực thi thực tế là gì và thiết kế ngược lại một giải pháp từ đó. Thông thường nó có nghĩa là một cặp dấu ngoặc được đặt chiến lược.
Nói ngắn gọn: bảng điều khiển cố gắng mô phỏng bối cảnh thực thi toàn cầu một cách chính xác nhất có thể, nhưng do những hạn chế của sự tương tác với công cụ v8 và ngữ nghĩa JavaScript, điều này đôi khi khó hoặc không thể giải quyết.