Nguyên tắc chung là một var
khai mỗi chức năng, và rằng var
khai thuộc ở phía trên cùng của hàm:
function foo() {
var bar;
}
Lý do để làm điều đó là để tránh nhầm lẫn có thể được gây ra bởi treo biến.
Một ví dụ về nơi này vấn đề là với bối cảnh đóng cửa cho callbacks:
//this looks like it will count up, but it wont
function foo() {
var i;
for (i = 0; i < 10; i++) {
var bar = i;
setTimeout(function() {
console.log(bar);
}, 1000 * i);
}
}
//this is actually what's happening behind the scenes
//hopefully you can see why it wont work
function foo() {
var i, bar;
for (i = 0; i < 10; i++) {
bar = i; //bar is in the same scope as i
setTimeout(function() {
//when this is called `i` and `bar` will both have a value of 9
console.log(bar);
}, 1000 * i);
}
}
Nếu bạn đã có một phụ chức năng, bạn có thể khai báo một biến mới cùng tên, mà sẽ vẫn cho phạm vi mà phụ chức năng:
function foo() {
var bar;
function baz() {
bar = 2;
}
bar = 1;
baz();
console.log(bar); //output will be 2 because baz operated in the outer scope
}
function foo() {
var bar;
function baz() {
var bar;
bar = 2;
}
bar = 1;
baz();
console.log(bar); //output will stay 1 because baz operated in its own scope
}
Nếu mã ví dụ của bạn là dọc theo dòng:
function foo() {
var base = {x:Infinity, y:Infinity};
...some code...
var base = {x:0, y:0};
}
Nó sẽ thực sự thực hiện như sau:
function foo() {
var base;
base = {x:Infinity, y:Infinity};
...some code...
base = {x:0, y:0};
}
# 3 - vâng, nhưng chủ yếu là bởi vì nó dễ dàng hơn để duy trì mã như vậy. – c69
vui lòng đăng thêm một chút mã ví dụ để cho biết bạn sẽ sử dụng mã này như thế nào. Đó là một chút mơ hồ cho dù hoisting biến sẽ là một vấn đề hoặc cho dù mỗi biến là trong một đóng cửa riêng biệt. – zzzzBov
Sử dụng var nhiều lần cho cùng một biến có thể hữu ích khi gỡ lỗi. –