Sự khác biệt giữa (1,eval)
cũ và đơn giản eval
là cái trước là một giá trị và cái sau là một giá trị. Sẽ rõ ràng hơn nếu đó là một số định danh khác:
var x;
x = 1;
(1, x) = 1;
Đó là (1,eval)
một biểu thức mang lại eval
(giống như nói, (true && eval)
hoặc (0 ? 0 : eval)
sẽ), nhưng nó không phải là một tham chiếu đến eval
.
Bạn quan tâm làm gì?
Vâng, ECMA đặc tả xem xét một tài liệu tham khảo để eval
trở thành một "cuộc gọi eval trực tiếp", nhưng một biểu thức mà chỉ đơn thuần mang lại eval
là một một gián tiếp - và các cuộc gọi eval gián tiếp được đảm bảo để thực hiện trong phạm vi toàn cầu.
Những điều tôi vẫn chưa biết:
- Trong trường hợp nào thì một lệnh gọi eval trực tiếp không thực thi trong phạm vi toàn cục?
- Trong trường hợp nào thì hàm
this
của một hàm ở phạm vi toàn cục có thể không mang lại đối tượng toàn cục?
Có thể thu thập thêm một số thông tin tại đây .
BIÊN TẬP
Rõ ràng, câu trả lời cho câu hỏi đầu tiên của tôi là, "hầu như luôn luôn". Một eval
thực thi trực tiếp từ phạm vi hiện tại . Hãy xem xét đoạn mã sau:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
Không ngạc nhiên (heh-heh), điều này in ra:
direct call: inner
indirect call: outer
BIÊN TẬP
Sau nhiều thử nghiệm hơn, tôi sẽ tạm thời nói rằng this
không thể đặt thành null
hoặc undefined
. Nó có thể được đặt thành các giá trị giả khác (0, '', NaN, false), nhưng chỉ rất cố ý.
Tôi sẽ nói rằng nguồn của bạn đang bị đảo ngược cranio-trực tràng nhẹ và có thể đảo ngược và có thể muốn xem xét dành một tuần lập trình trong Haskell.