Phiên bản đầu tiên:
for (var x in set) {
...
}
khai báo một biến cục bộ được gọi x
. Phiên bản thứ hai:
for (x in set) {
...
}
không làm.
Nếu x
đã là một biến cục bộ (tức là bạn có một var x;
hoặc var x = ...;
một nơi nào đó trước đó trong phạm vi hiện tại của bạn (tức là hàm hiện tại)) thì chúng sẽ tương đương. Nếu x
chưa phải là biến cục bộ, thì việc sử dụng biến thứ hai sẽ ngầm khai báo một biến toàn cục x
. Hãy xem xét mã này:
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
bạn có thể mong đợi điều này để cảnh báo hey
, there
, heli
, hey
, there
, copter
, nhưng kể từ khi x
là một và giống nhau nó sẽ cảnh báo hey
, there
,there
, hey
, there
, there
. Bạn không muốn điều đó! Sử dụng var x
trong các for
vòng lặp của bạn .
Trên hết: nếu for
vòng lặp nằm trong phạm vi toàn cục (tức là không nằm trong một hàm), thì phạm vi cục bộ (phạm vi x
được khai báo trong nếu bạn sử dụng var x
) giống với phạm vi toàn cục (phạm vi x
được khai báo ngầm trong nếu bạn sử dụng x
mà không có var), vì vậy hai phiên bản sẽ giống hệt nhau.
var
không được sử dụng để khai báo các iteratori
:Uncaught ReferenceError: i is not defined
. Vì vậy, tôi sẽ sử dụng nó từ bây giờ: / webpack xử lý biến "toàn cầu" thật là thú vị, cho thấy hơn: stackoverflow.com/a/40416826