2013-01-02 40 views
6

Tôi chạy vào một vấn đề phạm vi lạ với Javascript (xem JSFiddle):Javascript phạm vi biến toàn cục vấn đề

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    var someGlobal = 5; 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Displays 3, why? 
    alert(someGlobal); 
} 

someF(); 
someF2(); 

Tại sao không Javascript ném một vấn đề undefined trong someF2()? Làm thế nào đến someF2() có thể truy cập someGlobalsomeF() không? Làm thế nào tôi có thể chắc chắn rằng một biến toàn cục có thể truy cập được trong một hàm?

Ghi chú:

Trong cả hai trường hợp, các chức năng bắt đầu bằng cách gọi alert(someglobal), tại sao một chức năng ném một vấn đề xác định và người kia không?

Trả lời

7

someF tạo biến mới (cục bộ) được gọi là someGlobal (mặt nạ toàn cầu someGlobal) và gán giá trị cho nó. Nó không chạm vào toàn cầu someGlobal (mặc dù không thể truy cập nó vì có một biến khác có cùng tên trong phạm vi).

var báo cáo được kéo lên, vì vậy someGlobal được đeo mặt nạ cho tất cả của someF (không chỉ sau khi tuyên bố var). Giá trị của địa phương someGlobalundefined cho đến khi giá trị được gán cho nó.

someF2 truy cập toàn cầu (không bị ảnh hưởng) toàn cầu someGlobal.

+0

+1 cho câu trả lời hay nhất nhưng mô tả nhiều hơn rằng biến toàn cầu bị ghi đè bởi biến cục bộ trong hàm: D –

+0

Nó không bị ghi đè, nó bị che khuất. – Quentin

+0

bạn có thể cho tôi một chút giải thích về cả hai! tôi đã không thực hiện nghiên cứu về nó! Chỉ với chức năng đó, nó bị ghi đè hay không? –

4

Vì bạn đang khai báo biến cục bộ có cùng tên. Vì vậy, nó gán giá trị cho biến cục bộ. Chỉ cần loại bỏ var từ var someGlobal trong someF() và nó sẽ ổn.

var someGlobal = 3; 

function someF() { 
    // undefined issue 
    alert(someGlobal); 
    someGlobal = 5; // <-- orignially var someGlobal = 5 
    // Displays 5 
    alert(someGlobal); 
} 

function someF2() { 
    // Should display 5 now 
    alert(someGlobal); 
} 

someF(); 
someF2(); 
1

someF2 hiển thị 3 vì nó vẫn 3.

Trong someF(), bạn tạo một biến mới xảy ra có cùng tên với someGlobal. Điều đó không làm bất cứ điều gì với someGlobal ban đầu, nó chỉ tạo ra một biến mới tại địa phương để hàm someF biến mất khi hàm đó kết thúc.

Vì vậy, bạn có các biến cục bộ (ví dụ: được tạo bên trong someF với var) và biến toàn cục.

+0

Ok, nhưng tại sao tôi nhận được một vấn đề không xác định trong một trường hợp và không phải là khác? Đó là câu hỏi của tôi. – JVerstry

+0

Tôi nghĩ Quentin đã giải thích điều đó. –

-1

Dưới đây là ví dụ về cách sử dụng cả biến cục bộ và toàn cầu bên trong someF bằng cách sử dụng this.

var someGlobal = 3; 

function someF() { 

    // Displays 3 
    alert(someGlobal); 
    this.someGlobal = 5; 
    someGlobal = 5; 
    // Displays 5 
    alert(this.someGlobal); 
} 

function someF2() { 
    // Displays 5 
    alert(someGlobal); 
} 

someF(); 
someF2(); 

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