Sự cố khi khai báo với var
trong tiêu đề vòng lặp là nó lừa đảo. Nó trông như bạn đang khai báo một biến có phạm vi được giới hạn ở những for
vòng lặp, khi nó thực sự tồn tại ở khắp mọi nơi trong phạm vi chức năng - bao gồm trước tuyên bố:
var i = 1;
function foo() {
console.log(i); // 'undefined'
for (var i=1; i<100; ++i) {
}
}
Mặc dù cuộc gọi console.log
xảy ra trước tuyên bố của địa phương i
, nó vẫn còn trong phạm vi cho nó bởi vì nó bên trong cùng một chức năng. Vì vậy, các địa phương i
, mà chưa có bất kỳ giá trị được giao cho nó, là những gì được thông qua để log
. Điều này có thể gây ngạc nhiên; nó chắc chắn không hiển nhiên đối với bất kỳ ai không quen thuộc với các quy tắc phạm vi Javascript.
Bắt đầu với ECMAScript 2015, có cách tốt hơn để khai báo biến: let
. Các biến được khai báo với let
là cục bộ cho khối chứa chúng, chứ không phải toàn bộ hàm. Vì vậy, phiên bản này của các mã trên sẽ in 1
như dự định:
let i=1; // could use var here; no practical difference at outermost scope
function foo() {
console.log(i); // 1
for (let i=1; i<100; ++i) {
}
}
Vì vậy, thực hành tốt nhất trong Javascript hiện đại là để khai báo các biến với let
thay vì var
. Tuy nhiên, nếu bạn đang mắc kẹt với một pre-ECMAScript 2015 thực hiện, nó là một chút ít khó hiểu để khai báo tất cả các biến ở trên cùng của hàm, thay vì chờ đợi cho đến khi sử dụng đầu tiên.
Nguồn
2012-04-18 00:19:19
Bản sao có thể có của [Biến JavaScript khai báo bên ngoài hoặc bên trong vòng lặp?] (Http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop) –