2013-05-28 41 views

Trả lời

6

Thứ tự được diễn giải như được hiển thị bên dưới do cẩu nâng. Lưu ý rằng khi @ShadowCreeper chỉ ra chính xác, function a(){} thực sự tạo một biến cục bộ a bên trong hàm b được hoisted như hình dưới đây.

var a; 
var b; 

a = 6; 
b = function() { 
var a; 
a = function(){}; 
a = 10; 
console.log(a); //10 
} 
b(); 
console.log(a); //6 
+1

+1 để đề cập đến 'hoisting' – sabithpocker

+0

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

+0

+1 ví dụ tốt – John

2

Bởi vì bạn đang tạo một biến địa phương (các chức năng a) sau đó thay thế mà giá trị biến địa phương (các function) với 10.

Một cách để tránh những thứ như thế này là đặt trước tất cả các biến và hàm cục bộ bằng dấu "_" (dấu gạch dưới).

+0

điều gì đó cho tôi biết điều này là không chính xác. tôi không downvote, fwiw ... – xandercoded

+2

Nếu bạn đặt 'var a = 10;' ở trên cùng của hàm 'b', bạn sẽ có một biến cục bộ ẩn toàn cục. Tôi cũng tin rằng 'hàm a()' hoạt động giống như 'var a = function()' (tạo một biến cục bộ có tên 'a' là' hàm'). –

+0

đã đồng ý, khai báo cục bộ tiềm ẩn của 'hàm a' lồng nhau ở đây là cú pháp http://jsfiddle.net/AVcqr/ ... – xandercoded

2

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.

Các vấn đề liên quan