2013-08-31 37 views
5
for(var i = 0; i < 100; i++){ 
    var foo = 5; 

} 

Nó hoạt động ... nhưng điều này có tệ không?Khai báo biến nhiều lần

Tôi biết tôi có thể khai báo var foo bên ngoài, nhưng tại sao lại làm thế khi tôi chỉ sử dụng nó trong vòng lặp?

+11

Thực ra, nó chỉ được khai báo một lần. Tất cả các khai báo biến được đưa lên đầu phạm vi của chúng (bắt đầu hàm hoặc phạm vi toàn cục). Các khối không tạo phạm vi trong JavaScript. – bfavaretto

+0

@bfavaretto: Ít nhất là chưa. – elclanrs

+0

Mặc dù ngữ nghĩa hoạt động như mô tả bfavaretto, tôi thích "giữ các khai báo gần" với trang web sử dụng. Điều này sẽ không thay đổi cách mã hoạt động, nhưng * tôi thấy * rằng nó làm cho mục đích của mã rõ ràng hơn và tôi có thể quét mã để xem có điều gì đó trông đáng ngờ không. Những người khác có thể không đồng ý, và điều đó là tốt. – user2246674

Trả lời

3

Theo thời gian, phong cách cá nhân của tôi đã trở thành sở thích cho việc khai báo biến mà chúng "thực sự" trong "tâm trí" của ngôn ngữ cụ thể mà tôi đang làm việc. ngôn ngữ sẽ hoist họ anyway.

Điều này là để làm rõ ràng, giao tiếp chính xác, hiểu biết, bảo trì, để giữ cho các quy trình tâm thần của riêng tôi song song với các quy trình của ngôn ngữ, chỉ cần đề cập đến một vài lý do chính đáng. Vì vậy, trong trường hợp cụ thể này, tôi sẽ không đặt một tuyên bố var foo = 5; vào phần thân của vòng lặp for, vì lý do đơn giản là nó không hoạt động như nó đang thực hiện, tức là, nó không thực sự được redeclaring/re-scoping biến với mỗi lần lặp. (Đặt tuyên bố var trong phần khởi tạo của tiêu đề của vòng lặp (khởi tạo; điều kiện; sau) sẽ hợp lý hơn và chắc chắn là địa điểm chính xác để đặt ngôn ngữ đó có các biến cấp khối, chẳng hạn như khi JavaScript kết thúc thông qua việc khai báo kiểu let cho phạm vi khối cấp)

Ghi chú:.

  • thực hành này có thể không có vẻ "bình thường". Tâm trí tôi muốn giữ cho các biến "gần gũi" với việc sử dụng chúng, và thực hành hiện tại của tôi không tự nhiên đến với cách mà tâm trí của tôi hoạt động. Nhưng với tư cách là lập trình viên qua nhiều năm, trải nghiệm với sự nhầm lẫn, giao tiếp xấu, hiểu lầm, mã không thể duy trì không thể làm sáng tỏ, v.v., có nhiều hơn biện minh cho kỷ luật bổ sung mà tôi phải tuân theo kiểu khai báo biến này ở các vị trí tương ứng phạm vi thực tế, bất kể ngôn ngữ.

  • Một lợi ích bổ sung của thực tiễn này đối với tôi là nó khuyến khích tôi giữ cho các chức năng của mình có kích thước mô-đun và hợp lý.

  • Dọc theo cùng một dòng, thực hiện theo cách này tự động giúp giữ mã của tôi được sắp xếp theo cách hợp lý.Ví dụ, nếu đặt chức năng của tôi trước hết là có chức năng quá mức trước mã tôi đang thực sự làm việc, và do đó tôi bị kích thích về việc phải xuống hai trang để chỉnh sửa chương trình của mình, theo phong cách này tự động mang lại cho tôi động cơ tổ chức mã vào một cấu trúc thích hợp của các tệp riêng biệt.

P.S. Người ta có thể đưa ra một điểm rằng một số chức năng là quá lâu mà thực hành này làm cho tờ khai biến kết thúc các trang cách xa nơi chúng được sử dụng. Có, tôi đã nhìn thấy mã nơi đó là sự thật, và có lẽ ngay cả mã nơi mà không thể được giúp đỡ. Tuy nhiên, tôi không thể không quan sát song song cũng đúng cho các tác giả văn xuôi vì nó dành cho các lập trình viên máy tính. Khi mức độ kỹ năng tăng lên, độ dài của các câu của tác giả (và kích thước của các hàm lập trình viên) có xu hướng tăng lên, và khi mức độ kỹ năng tiếp tục tăng cao hơn, độ dài của câu (và kích thước của các hàm lập trình) có xu hướng rút ngắn một lần hơn.

+0

Hãy chắc chắn rằng bạn giữ cho các phương thức của bạn mỏng, sau đó bạn không cần nhiều biến đó ở rất nhiều nơi. Nhưng tôi cũng thích tuyên bố các biến mà chúng được sử dụng, ngay cả khi chúng được nâng lên. –

3

Điều này là xấu bởi vì nó cho hiển thị sai rằng ifoo là các biến cục bộ.

for(var i = 0; i < 100; i++){ 
    var foo = 5; 
} 
foo; // 5 

này có thể không là một vấn đề với mã đơn giản, nhưng nếu bạn sử dụng đóng cửa nó trở nên rõ ràng rằng chỉ có một foo có:

var counters = []; 
for (var i = 0; i < 100; i++) { 
    var foo = 5; 
    counters.push(function() { foo++; return foo; }); 
} 
counters[0](); // 6 
counters[0](); // 7 
counters[1](); // 8 (!) 

Để tạo foo trong một phạm vi khác nhau một chức năng cần được giới thiệu:

var counters = []; 
for (var i = 0; i < 100; i++) { 
    (function() { 
     var foo = 5; 
     counters.push(function() { foo++; return foo; }); 
    })(); 
} 
counters[0](); // 6 
counters[0](); // 7 
counters[1](); // 6 

Dưới đây là một ví dụ thực tế cuộc sống của mọi thứ đi sai vì điều này: setTimeout in for-loop does not print consecutive values

Vì JavaScript 1.7 bạn có thể sử dụng từ khóa let (xem MDN) để tạo các biến cục bộ thực sự.

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