Tôi đã gặp sự cố rất lạ (đối với tôi) với từ khóa var
. Tôi đã giảm nó thành một trường hợp thử nghiệm khá nhỏ và thấy nó được trưng bày trong Node.js (như vậy, V8 và Chrome), trình kiểm tra của Safari 4 (như vậy, Nitro) và FireBug (rõ ràng là SpiderMonkey). Ban đầu tôi đã chuẩn bị một báo cáo lỗi, nhưng vì nó được hiển thị rộng rãi, tôi sẽ giả định rằng tôi hoàn toàn hiểu sai cách JavaScript được cho là phạm vi và tra cứu các biến.Thao tác khó hiểu của từ khóa `var` của JavaScript
Trường hợp kiểm tra rất nhỏ và trên GitHub tại đây: http://gist.github.com/260067. Sự khác biệt duy nhất giữa ví dụ đầu tiên và thứ hai là việc bao gồm từ khóa var
.
Ở đây, là tốt, là một trường hợp thử nghiệm tương tự mà thể hiện cùng một 'vấn đề' theo một cách khác: https://gist.github.com/698b977ee0de2f0ee54a
Edit: Để ngăn cản nhiều hơn bất kỳ câu trả lời cố gắng giải thích cách tầng phạm vi hoạt động, tôi m thân mật quen thuộc với điều đó. Vấn đề của tôi, là tôi không hiểu tại sao đoạn mã sau 'làm việc' (ở chỗ nó alert()
s 'bên ngoài,' theo sau 'bên trong,' và sau đó một lần nữa 'bên ngoài'):
(function(){
var foo = 'outer';
alert("Outer `foo`: " + foo);
(function(){
foo = 'inner';
alert("Inner `foo`: " + foo);
var foo;
})();
alert("Outer `foo`: " + foo);
})();
Các var foo;
xảy ra ở một vị trí hoàn toàn không liên quan đến việc phân bổ lại foo
; vậy tại sao nó ảnh hưởng đến nhiệm vụ đó một cách rất quan trọng?
Tại sao bạn sử dụng eval? Hoàn toàn không có lý do gì để sử dụng eval trong mã bạn đã đăng. – Marius
Để chứng minh sự cố. Việc thực hiện thực tế là rất khác nhau; bạn có thể thấy nó trong tự nhiên ở đây: http://github.com/elliottcable/poopy.js/blob/new-acquire/lib/from.js#L193 – ELLIOTTCABLE
Ví dụ cuối cùng của bạn hoạt động vì 1) foo = 'inner'; gán giá trị cho phạm vi foo chính mà hàm này có quyền truy cập. 2) bạn không cần phải sử dụng var để khai báo một biến. – Marius