2013-04-02 27 views
5
x = 1; 
alert(x); 
var y = function() { 
    alert(x); 
    var x = 2; 
    alert(x); 
} 
y(); 

Kết quả của 3 cảnh báo là: 1, undefined, 2 (Chrome 25)Tại sao biến toàn cầu của tôi bị che khuất trước tuyên bố địa phương?

Câu hỏi của tôi là: tại sao các cảnh báo thứ hai là undefined? Tại sao không 1? Không có biến toàn cục x?

+0

Vì bạn đổ bóng 'x' trong chức năng của mình. Vì vậy, có một biến chức năng phạm vi 'x', mà chưa được gán một giá trị để bạn có được undefined. Đây là lý do tại sao nó luôn luôn được đề nghị để khai báo các biến của bạn ở đầu của hàm, bởi vì nó sẽ được thực hiện cho bạn anyway. Cố gắng không nhầm lẫn bản thân. – Chad

Trả lời

12

Do hoisting, đây là những gì được thực hiện:

x = 1; 
alert(x); 
var y = function() { 
    var x; // <-- this gets hoisted up from where it was. 

    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

Khi bắt đầu chức năng y(), các địa phương biến x được khai báo nhưng không được khởi tạo.

+0

nhưng nếu "x" là "cẩu", không có xung đột? bởi vì đã có một "x = 1"? Tuyên bố nào là đầu tiên? "cẩu x" hoặc "x = 1"? –

+0

Javascript không có "xung đột" nó "bóng". Biến cục bộ "bóng" bất kỳ biến nào có cùng tên là phạm vi cao hơn. Vì vậy, sau này khi bạn sử dụng 'x' nó đang sử dụng phạm vi địa phương nhất. Cái toàn cầu được định nghĩa trước, nhưng trong phạm vi 'y', cái cục bộ được sử dụng. – Chad

+0

Cách hoạt động của phạm vi là javascript đầu tiên tìm trong phạm vi cục bộ cho biến x. Nếu nó tìm thấy nó, nó dừng lại tìm kiếm, vì vậy chúng tôi không bao giờ nhận được đến toàn cầu x. Nếu nó không tìm thấy nó, nó di chuyển lên một mức độ đến bất cứ phạm vi nào khi hàm được khai báo và tìm kiếm ở đó với cùng một mẫu. (Trong trường hợp này, nó tìm thấy tuyên bố sau đó, vì nó đã đạt đến phạm vi toàn cầu). Vì vậy, về cơ bản, nó hoạt động giống như một hành tây, trong ra ngoài. –

1

Tuyên bố biến trong hàm được treo lên trên cùng. Vì vậy, về mặt kỹ thuật, nó trông giống như sau:

var y = function() { 
    var x; 

    alert(x); 

    x = 2; 
}; 

Biến cục bộ sẽ làm lu mờ toàn cầu. Đó là lý do cảnh báo trả về undefined.

0

Vì phạm vi trong JavaScript là đối tượng hàm. Khi bạn thực hiện một số mã trong một hàm (mẫu mã của bạn), "alert (x)" sẽ tìm thấy nếu có bất kỳ định nghĩa nào về "x" trong hàm. Vì vậy, có một "var x = 2" trong chức năng này. Nhưng thời gian chạy JavaScript sẽ giải thích code của bạn như thế này:

x = 1; 
alert(x); 
var y = function() { 
    var x; 
    alert(x); 
    x = 2; 
    alert(x); 
} 
y(); 

Vì vậy, x trong cảnh báo thứ hai là "không xác định" không phải là "1". Vì vậy, khi bạn khai báo một số biến trong một hàm, tôi khuyên bạn nên khai báo các biến ở trên cùng của hàm của bạn.

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