Tinh chỉnh ví dụ của bạn, bạn có thể xem những gì đang xảy ra, và trong khi lệnh là một chút mâu thuẫn, nó trông giống như một con bọ. Xác định a làm chức năng và ghi nhật ký thay vì f, sau đó xem bảng điều khiển. Bạn sẽ thấy rằng việc đóng được tạo bằng a, f và g. Kể từ một được tham chiếu trong g, và f và g sẽ được hiển thị với nhau, nó có ý nghĩa một chút. Nhưng eval hoạt động trong phạm vi toàn cầu. Vì vậy, khi bạn cố gắng truy cập chúng, bạn sẽ không được xác định. Nó giống như đóng cửa này không thể được truy cập từ bất cứ nơi nào.
Hãy thử:
eval('let a = function(){}; function f() {};function g(){a;};console.dir(a);');
Bạn sẽ thấy điều này trong bảng điều khiển
<function scope>
Closure
a: function()
f: function f()
g: function g()
Mọi trường hợp khác của bạn khiến tình hình rõ ràng hơn, và ngăn ngừa các vấn đề:
- eval không được sử dụng: phạm vi sai đối sánh ít rõ ràng hơn,
- mã bên trong eval được bao quanh với {}: các biến được liên kết thông qua phạm vi Chặn.
- a không được tham chiếu trong g: không cần đóng cửa nếu các biến không được liên kết.
- cho thay đổi thành var: var trong phạm vi toàn cầu được xác định trong phạm vi toàn cầu . Vì vậy, không cần thiết Đóng
- "sử dụng nghiêm ngặt" được thêm vào trước khi mã: use strict trong eval ngăn biến được bổ sung vào phạm vi toàn cầu, vì vậy một lần nữa, "dễ dàng hơn" để xử lý. Không có sự không phù hợp giữa việc cho phép cần thiết để được liên kết với các chức năng toàn cầu.
Nguồn
2016-08-17 05:34:34
'let' được hỗ trợ ở chế độ sloppy kể từ Chrome 49.0 theo [MDN] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let#Browser_compatibility). – johnchen902
Ah ... Tôi đang sử dụng v47 ... – strah