2013-11-01 22 views
63

Tôi mới vào JavaScript và tôi đã thực hiện một số hoạt động trên phạm vi biến địa phương và toàn cầu, đây là mã của tôi (fiddle):Javascript địa phương và toàn cầu biến nhầm lẫn

var myname = "initial" 
function c(){ 
    alert(myname); 
    var myname = "changed"; 
    alert(myname); 
} 
c(); 

khi cảnh báo đầu tiên được gọi, nó đang hiển thị myname là không xác định. do đó, sự nhầm lẫn của tôi là lý do tại sao tôi không thể truy cập một phiên bản toàn cầu của myname và nếu tôi không xác định myname trong chức năng thì nó sẽ hoạt động tốt.

+1

nếu bạn thực hiện ** cảnh báo (window.myname); ** thì bạn sẽ nhận được các giá trị –

+0

@dholakiyaankit Tôi đã thử sử dụng window.myname vẫn đang nói là không xác định ... –

+0

@BharatSoni window.myname hoạt động trong trình duyệt. – EmptyArsenal

Trả lời

6

Nó không thay thế biến toàn cục. Điều gì đang xảy ra được gọi là "hoán đổi biến". Tức là, var myname; được chèn ở đầu chức năng. Luôn khởi tạo các biến của bạn trước khi bạn sử dụng chúng - thử điều này:

var myname = "initial"; 
 

 
function c() { 
 
    alert(myname); 
 
    myname = "changed"; 
 
    alert(myname); 
 
} 
 

 
c();

+0

thưa bạn, tôi không chỉ cố gắng thay đổi giá trị .. những gì bạn đang làm đang thay đổi giá trị của biến toàn cầu. Tôi muốn hiểu khái niệm "TẠI SAO" nó đang xảy ra ... –

+0

Điều này khắc phục vấn đề cảnh báo undefined, nhưng nó loại bỏ bất kỳ biến cục bộ nào vì nó chỉ sử dụng biến toàn cục 'myname'. – EmptyArsenal

+0

Nó không thay thế biến toàn cục. Điều gì đang xảy ra được gọi là "hoán đổi biến". Đó là, myname var myname; được chèn vào đầu của hàm. Luôn khởi tạo các biến của bạn trước khi sử dụng chúng, bạn có thể tham khảo http://stackoverflow.com/questions/11938961/understanding-global-local-scope-in-javascript?rq=1 –

42

Trong javascript, các khai báo biến sẽ được tự động chuyển đến đầu của hàm. Vì vậy, thông dịch viên sẽ làm cho nó trông giống như thế này:

var myname = "initial" 
function c(){ 
    var myname; 
    // alerts undefined 
    alert(myname); 
    myname = "changed"; 
    // alerts changed 
    alert(myname); 
} 
c(); 

Điều này được gọi là 'cẩu'.

Do cẩu và thực tế là phạm vi cho bất kỳ biến nào là hàm được khai báo, đó là thực hành tiêu chuẩn để liệt kê tất cả các biến ở đầu hàm để tránh nhầm lẫn này.

+0

mà tôi đã hiểu, vì vậy hiện tại có cách để truy cập một biến toàn cục có cùng tên với biến cục bộ .. ?? –

+2

Bạn có thể truy cập nó bằng cách thực hiện 'window.myname'. Xem ở đây: http://stackoverflow.com/questions/15826751/access-overridden-global-variable-inside-a-function Nhưng các biến toàn cầu thường không được coi là một thực hành tốt, và trong hầu hết các trường hợp nó sẽ là tốt hơn để xác định một đối tượng toàn cầu và truy cập nó thông qua đó. tức là 'var me = {myname:" initial "}' sau đó gọi 'me.myname' trong hàm. – EmptyArsenal

+1

Không đúng khi nói rằng khai báo biến được chuyển lên trên cùng. Ví dụ, nếu trên dòng 10 nó được viết var myname = "initial", kết quả chúng ta thấy không giống var myname = "initial" trên dòng 1, nhưng thực sự chúng ta thấy hành vi như thể var myname nằm trên dòng 1 và trên dòng 10 nó được gán giá trị tức là myname = "initial" –

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