2011-10-03 23 views
5

Tôi không thể tìm thấy kết hợp chính xác về vấn đề của mình, mặc dù có nhiều câu hỏi về phạm vi javascript tồn tại. Đây là mã hiện tại của tôi cho câu hỏi.Javascript Scoping Confusion

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    //var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

Khi tôi chạy này, tôi đang thông báo với "blank" và sau đó "một" như mong đợi. Tuy nhiên, nếu tôi uncomment rằng một dòng, do đó, nó trông như thế này.

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

Tôi cảnh báo với "blank" và sau đó "blank". Đây không phải là những gì tôi mong đợi và tôi thấy nó khó hiểu rằng việc thêm một dòng sẽ loại bỏ hành vi. Bất cứ ai có thể giải thích những gì đang xảy ra ở đây? Tôi thấy hành vi này trong cả firefox và safari.

+0

Tuy nhiên, một lý do chính đáng tại sao bao giờ sử dụng các biến địa phương với tên giống như các biến toàn cục chỉ là chuốc lấy phiền. – jfriend00

Trả lời

7

Tất cả các báo cáo var có hiệu quả "treo lên" lên đến đầu chức năng kèm theo của chúng (loại). Do đó, thực tế là bạn có var my_varở bất kỳ nơi nào trong hàm đó có nghĩa là tất cả các đề cập đến "my_var" đều đề cập đến biến cục bộ.

(tôi nói "loại" vì phần phân công của tuyên bố var không chuyển, chỉ cần tờ khai rằng nhận dạng phải là một biến cục bộ.)

+0

tài liệu? bất cứ điều gì xác nhận điều này ngoài ví dụ? – Neal

+0

Để hoàn thành câu của bạn. Các cẩu làm cho 'my_var' một biến địa phương bên trong toàn bộ chức năng. – jfriend00

+0

Thông số kỹ thuật làm cho nó khá rõ ràng. Mục 12.2. Các cuộc đàm phán cụ thể về các biến được "tạo ra", và đó là phần "cẩu". – Pointy

3

Lý do là vì tờ khai được kéo lên trong vòng một phạm vi chức năng trong JavaScript. Đọc thêm về nó here.