2015-06-03 31 views
5

Đây là một báo giá from MDN về 'cho' tuyên bố:Optimization - Đối với tuyên bố và khai báo biến

Một biểu thức (bao gồm cả biểu thức phân) hoặc biến khai. Thường được sử dụng để khởi tạo biến số lượt truy cập. Biểu thức này có thể tùy ý khai báo các biến mới bằng từ khóa var. Các biến này không phải là cục bộ đối với vòng lặp, tức là chúng nằm trong cùng phạm vi vòng lặp for. Kết quả của biểu thức này bị hủy.

Vì vậy, khi tôi viết loại code này:

for(var i = 0; i < 10; i++) { 
    for(var j = 0; j < 10; j++) { 
     // ... 
    } 
} 

Tại mỗi lần lặp của vòng lặp bên ngoài Tôi tuyên bố biến j, mà đã được công bố phải không?

Vậy là nó tốt hơn để viết một cái gì đó như thế này:

for(var i = 0, j = 0; i < 10; i++) { 
    for(j = 0; j < 10; j++) { 
     // ... 
    } 
} 

... hoặc chúng tôi không quan tâm?

+0

Chừng nào bạn khai báo nó trong phạm vi chức năng tương tự, nó doesn không quan trọng. Nếu bạn khai báo nó ở vòng lặp for, nó sẽ giúp bạn thể hiện ý định chỉ sử dụng nó trong vòng lặp for. Vì vậy, tôi sẽ đi với tùy chọn 1. – nils

Trả lời

5

Hành vi báo giá này đề cập đến được gọi là cẩu và điều quan trọng là phải biết bằng JavaScript.

Sau đây là cách the MDN explains it:

Bởi vì khai báo biến (và tờ khai nói chung) là xử lý trước khi bất kỳ mã được thực thi, khai báo một biến bất cứ nơi nào trong các mã tương đương với tuyên bố nó ở đầu trang. Điều này cũng có nghĩa là rằng một biến có thể xuất hiện được sử dụng trước khi nó được khai báo. Hành vi này được gọi là "cẩu", vì dường như biến số được chuyển lên đầu hàm hoặc mã toàn cầu.

Lý do bạn không khai báo tất cả các biến ở trên cùng của hàm, là do nội dung bản địa hóa làm cho mã rõ ràng hơn.

hoàn toàn không đạt được khi có cả hai vars được khai báo trong vòng lặp đầu tiên. Nó chỉ gây nhầm lẫn. Điều này cũng giống với động cơ JS, nhưng các nhà phát triển khác đọc mã này sẽ tự hỏi tại sao j được khai báo ở một vị trí bất ngờ. Bây giờ, nếu bạn bị quấy rầy bởi thực tế biến của bạn tồn tại trước đây (với giá trị undefined) và sau vòng lặp nơi bạn sử dụng nó, vui mừng: có một kiểu khai báo mới sắp tới với ES6: let, phạm vi biến vào khối.

for(let i = 0; i < 10; i++) { 
    for(let j = 0; j < 10; j++) { 
     // ... 
    } 
} 

Beware: compatibility of let

Bây giờ, hãy sử dụng mẫu tiêu chuẩn mà tất cả mọi người mong đợi:

for(var i = 0; i < 10; i++) { 
    for(var j = 0; j < 10; j++) { 
     // ... 
    } 
} 

Các ước, trong trường hợp này, đó là ij sẽ không được sử dụng bên ngoài của vòng lặp của họ. Khi (và chỉ trong trường hợp này), bạn muốn sử dụng i hoặc j sau (ví dụ có một break trong vòng lặp), sử dụng này:

var i, j; 
for(i = 0; i < 10; i++) { 
    for(j = 0; j < 10; j++) { 
     // ... 
    } 
} 
// use i and j here 
+0

Điều gì về việc có hai vòng liên tiếp, không lồng nhau? Tôi thường khai báo biến i một lần ở đầu hàm trong các trường hợp này –

+0

@Pablo Cá nhân tôi muốn lặp lại câu lệnh 'var', ngay cả khi vô dụng: nó rõ ràng hơn và ngăn chặn lỗi trong ngày mà ai đó tái cấu trúc và di chuyển vòng lặp. Lưu ý rằng một số linters bị nhầm lẫn trong trường hợp này, mặc dù. –

+0

Tôi đã làm điều đó, nhưng tôi bắt đầu sử dụng JShint và nó phàn nàn về các khai báo trùng lặp ở khắp mọi nơi ... tuy nhiên tôi đặt lại biến mỗi lần để tránh lỗi đó –

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