This answer có lời giải thích thực sự thú vị về những gì đang diễn ra ở đây.
Tóm tắt là Javascript được xử lý theo hai giai đoạn, biên dịch và sau đó thực thi. Các định nghĩa hàm xảy ra trong bước biên dịch, vì vậy bên trong của b
trình biên dịch sẽ thấy định nghĩa function a() {}
và biến cục bộ a
được tạo trong phạm vi b
. Sau này khi mã được thực thi, phạm vi b
đã chứa biến cục bộ a
trước khi bất kỳ mã nào được thực thi, do đó, dòng a = 10;
chỉ cho biến cục bộ một giá trị mới. Định nghĩa hàm đã được xử lý trong quá trình biên dịch sao cho sẽ không xảy ra trong khi thực thi, vì vậy console.log(a)
sẽ xuất ra 10
.
Nguồn
2013-05-29 00:01:44
+1 để đề cập đến 'hoisting' – sabithpocker
Việc xác định' a' như một hàm bên trong 'b' buộc' a' là cục bộ thành 'b', thậm chí không thực hiện' var a' một cách rõ ràng. Ma thuật đằng sau phạm vi địa phương tiềm ẩn là gì? – sabithpocker
+1 ví dụ tốt – John