Có hoàn toàn không có sự khác biệt về ý nghĩa hoặc hiệu suất, trong JavaScript hoặc ActionScript.
var
là một lệnh cho trình phân tích cú pháp và không phải là lệnh được thực thi trong thời gian chạy. Nếu một mã định danh cụ thể đã được khai báo var
một lần hoặc nhiều hơn bất cứ nơi nào trong thân hàm (*), thì tất cả việc sử dụng mã định danh đó trong khối sẽ được tham chiếu đến biến cục bộ. Không có sự khác biệt cho dù value
được tuyên bố là var
bên trong vòng lặp, bên ngoài vòng lặp hoặc cả hai.
Do đó, bạn nên viết bất cứ điều gì bạn thấy dễ đọc nhất. Tôi không đồng ý với Crockford rằng đặt tất cả các vars lên hàng đầu của một chức năng luôn là điều tốt nhất. Đối với trường hợp một biến được sử dụng tạm thời trong một phần của mã, tốt hơn là khai báo var
trong phần đó, vì vậy phần đó đứng một mình và có thể được sao chép. Mặt khác, sao chép-dán một vài dòng mã vào một chức năng mới trong quá trình tái cấu trúc, mà không chọn riêng và di chuyển liên kết var
, và bạn đã có cho mình một thế giới tình cờ.
Đặc biệt:
for (var i; i<100; i++)
do something;
for (var i; i<100; i++)
do something else;
Crockford sẽ khuyên bạn nên loại bỏ cái thứ hai var
(hoặc loại bỏ cả var
s và làm var i;
ở trên), và jslint sẽ rên rỉ với bạn vì điều này. Nhưng IMO sẽ dễ duy trì hơn để giữ cả hai var
s, giữ tất cả các mã liên quan với nhau, thay vì có một đoạn mã bổ sung, dễ bị lãng quên ở đầu hàm.
Cá nhân tôi có xu hướng khai báo là var
lần gán đầu tiên của một biến trong một phần mã độc lập, cho dù có sử dụng riêng một tên biến khác trong một phần khác của cùng một hàm hay không. Đối với tôi, việc phải khai báo var
tất cả là một mụn cóc JS không mong muốn (tốt hơn là nên có các biến mặc định thành cục bộ); Tôi không coi nhiệm vụ của mình là sao chép các giới hạn của [bản sửa đổi cũ của] ANSI C trong JavaScript.
(*: khác với các hàm chức năng lồng nhau)