2009-04-26 82 views
22

sự khác biệt giữa là gì:phạm vi Biến trong Javascript vòng lặp for

function bar() 
{ 
    for (x=0; x< 100; x++) {} 
} 

function bar() 
{ 
    var x; 
    for (x=0; x< 100; x++) {} 
} 

Nếu x không được tuyên bố bên ngoài chức năng đó, và vì vậy nó không phải là một biến toàn cầu? Tôi luôn tự hỏi điều này bởi vì tôi thường không khai báo các biến throwaway được sử dụng chỉ trong một vòng lặp, nhưng tôi tự hỏi nếu điều này có thể phá vỡ sự so sánh trong một trình duyệt hay như vậy.

Trả lời

34

Ví dụ đầu tiên sẽ thêm hoặc sửa đổi biến toàn cầu x, thường tránh được nếu không phải là kết quả mong muốn.

Trong khi ví dụ thứ hai của bạn hoạt động như mong muốn (không tác dụng phụ) một sự thay thế trông tốt hơn trong quan điểm của tôi sẽ là

function bar() 
{ 
    for (var x=0; x< 100; x++) {} 
} 
+0

Bất kỳ biến nào không được khai báo bằng "var" sẽ luôn là biến toàn cục. Đây là mục nhập MDC trên var: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/Var – cdmckay

+16

Nó có thể trông đẹp hơn, nhưng JavaScript không có phạm vi khối, do đó không có vấn đề gì nếu bạn khai báo 'x' bên trong hoặc bên ngoài vòng lặp 'for'. (JS 1.7 giới thiệu từ khóa 'let', xem câu trả lời của noha.) –

+2

+1 để luôn thêm var. Tôi đã nhìn thấy nhiều trường hợp trong đó một vòng lặp sử dụng 'i' gọi một hàm với vòng lặp riêng của nó bằng cách sử dụng 'i', nơi cả hai cập nhật toàn cầu 'i'. Nó có thể đi không được chú ý trong một số trường hợp nhưng hoàn toàn lộn xộn những thứ khác trong những người khác. – scunliffe

16

Một biến được tạo ra tại thời điểm bạn tuyên bố/sử dụng nó. Nếu bạn bỏ qua từ khóa var thay vì biến được tạo tự động trong phạm vi toàn cục. Vì vậy, bạn tạo ra một tác dụng phụ. Điều này thường tránh được.

Giả sử bạn sử dụng các biến toàn cục và sau đó bạn đã chọn tên biến mà một số phần khác của phần mềm đã thực hiện. Điều này sẽ dẫn đến một tình huống mà các đoạn mã ghi đè lên các giá trị của chúng. Điều này tạo ra lỗi và phần lớn thời gian khó gỡ lỗi. Trong ví dụ của bạn, bạn có thể ghi đè lên biến toàn cầu x mà một phần mềm khác đang sử dụng.

Sử dụng var cũng nhanh hơn. Nếu bạn truy cập vào một biến toàn cầu, nó phải quét tất cả các phạm vi đến phạm vi toàn cầu cho tên biến. Bằng cách sử dụng var nó được ràng buộc với phạm vi địa phương của bạn.

Thực hành tốt là luôn sử dụng var. Hoặc tốt hơn: tốt nhất là chọn phạm vi thu hẹp nhất cho các biến của bạn. Bây giờ bạn có toàn cầu và var. Một khai báo var có thể nhìn thấy trong toàn bộ hàm bất kể bạn khai báo nó ở đâu. Trong javascript 1.7 có từ khóa mới được giới thiệu: let. Hãy thu hẹp phạm vi hơn nữa. Nếu bạn khai báo vòng lặp của bạn với

for(let x = 0; x < 100; i++) {} 

so với x chỉ hiển thị trong khối {}.

+0

Hiện có 1,7 trên hầu hết các trình duyệt không? –

2

Luôn nhớ rằng, trong JavaScript, phạm vi được xác định theo chức năng. Trong ví dụ

function() { 
    var x = 15; 
    bar(); 
    function bar() { 
     for (x=0; x< 100; x++) {} 
    } 
    //here x will be 100 
} 

Bạn có thể vô tình truy cập phạm vi cao hơn. Những gì tôi có nghĩa là phạm vi cao hơn là một chức năng wrapper hoặc window.x (nếu không có chức năng wrapper hơn là có). Sẽ tốt hơn nếu bạn dính vào ví dụ thứ hai nếu bạn chỉ muốn sử dụng x cho vòng lặp của mình.

function() { 
    var x = 15; 
    bar(); 
    function bar() { 
     var x; 
     for (x=0; x< 100; x++) {} 
    } 
    //here x will be 15 
} 
Các vấn đề liên quan