2009-05-01 27 views
63

JSLint (với cờ onevar bật) là gì đang giảm sút một số mã javascript mà tôi có như sau:lý do đằng sau JSLint nói có "quá nhiều báo cáo var"

Problem at line 5 character 15: Too many var statements.

Tôi vui mừng sửa các lỗi này, nhưng tôi muốn biết, tôi có đang thực hiện nó cho hiệu suất hay không vì nó chỉ là một thực hành không tốt và có tiềm năng lớn hơn để giới thiệu các lỗi trong mã javascript của tôi. Lý do đằng sau cờ onevar là gì?

Tôi đã xem các tài liệu JSLint cho var keyword nhưng nó không cụ thể nói về lý do tại sao nhiều câu lệnh var trong cùng một hàm là xấu.

Đây là một ví dụ. Giải thích cách mã sẽ được hưởng lợi từ chỉ có 1 var tuyên bố:

function Test(arg) { 
    var x = arg + 1, 
     y = cache.GetItem('xyz'); 
    if (y !== null) { 
     // This is what would cause the warning in JSLint 
     var request = ajaxPost(/* Parameters here */); 

    } 
} 
+0

Hiển thị cho chúng tôi tập lệnh ya! – alex

Trả lời

99

Javascript không có phạm vi chặn. Trong các ngôn ngữ khác với nó (như c), nếu bạn khai báo một biến trong câu lệnh if, bạn không thể truy cập nó bên ngoài nó, nhưng trong javascript bạn có thể. Tác giả của JSLint tin rằng đó là một thực hành tồi, vì bạn (hoặc những độc giả khác) có thể bị lẫn lộn và nghĩ rằng bạn không còn có thể truy cập vào biến đó nữa, nhưng bạn thực sự có thể. Vì vậy, bạn nên khai báo tất cả các biến của bạn ở trên cùng của hàm.

+0

Câu trả lời hay hơn tôi, sửa đổi. – tpdi

+7

Điều này trả lời một phần của câu hỏi là tại sao người ta phải khai báo tất cả 'VAR' ở trên cùng của hàm, nhưng điểm về câu lệnh "one' VAR' "vs" multiple 'VAR' (tất cả tại hàng đầu)". Có lý do * tốt * nào cho điều này hay chỉ là "nó tiết kiệm đánh máy, vậy tại sao không" là gì? –

+0

Các quy tắc JSLint mặc định chỉ đại diện cho [ý kiến ​​của david crockford] (http://www.jslint.com/help.html) về cách tạo mã đúng và không chính xác một cách trực quan. ý kiến ​​của anh ấy là lý do * tốt *? dunno, nhưng ít nhất là * một lý do *. – worc

1

Chỉ cần một đoán ở đây, nhưng nó có thể là thời gian cho functional decomposition. Các chức năng nên làm một điều và thực hiện tốt.

Quá nhiều vars là gợi ý về chức năng đang cố gắng thực hiện quá nhiều. Hoặc một trường hợp bạn nên sử dụng một mảng.

+0

Không chắc chắn tôi đồng ý với điều này. Trong trường hợp này, "quá nhiều" là nhiều hơn một var. Để giải quyết nó, bạn có thể sử dụng dấu phẩy, ('var x, y;') nhưng khó đọc. Điều này là khá vô lý, theo ý kiến ​​của tôi, và khuyến khích khó đọc mã. Tôi hiện đang làm việc trên một dự án với rất nhiều điều này, và thật khó để xem các biến được khai báo ở đâu. –

3

Nếu tùy chọn "onevar" được đặt thành true nếu chỉ cho phép một câu lệnh var cho mỗi hàm.

if (funct['(onevar)'] && option.onevar) { 
    warning("Too many var statements."); 
} 
+0

Được rồi, tôi đã giải thích rõ ràng trong câu hỏi tôi đã bật tính năng này. Vì vậy, tôi biết lý do tại sao nó cảnh báo tôi, nhưng những gì đang sửa chữa những cảnh báo làm cho mã của tôi? – slolife

-6

Ý tưởng là bạn nên sử dụng một đối tượng thay vì các vars riêng lẻ. Vì vậy, nơi bạn có được:

var x = arg + 1, 
    y = cache.GetItem('xyz'); 

Thay đổi nó để:

var dimensions = {}; 
dimensions.x = arg + 1; 
dimensons.y = cache.GetItem('xyz'); 
dimensions.request = ... 

Sau đó bạn có thể truy cập các biến thông qua các đối tượng, gọn gàng của nó để có một đối tượng cho mỗi chức năng để chứa các biến chức năng. Sau đó, bạn sẽ không nhận được cảnh báo.

6

Chỉ cần khai báo VAR của bạn ở một nơi như thế này:

var request,x,y; 
29

Lý do chính thức is here, bởi Douglas Crockford.

Để quote:

Trong nhiều ngôn ngữ, một khối giới thiệu một phạm vi. Các biến được giới thiệu trong một khối không hiển thị bên ngoài khối.

Trong JavaScript, các khối không giới thiệu phạm vi. Chỉ có phạm vi chức năng. Một biến được giới thiệu ở bất kỳ đâu trong hàm là hiển thị ở mọi nơi trong hàm. Các khối JavaScript gây nhầm lẫn lập trình viên có kinh nghiệm và dẫn đến lỗi vì cú pháp quen thuộc đưa ra một lời hứa sai.

JSLint dự kiến ​​chặn bằng chức năng, nếu, chuyển, trong khi, cho, làm và thử các câu lệnh và không nơi nào khác.

Trong các ngôn ngữ có phạm vi khối, thường được đề xuất rằng các biến số được khai báo tại trang web sử dụng đầu tiên. Nhưng vì JavaScript không có phạm vi khối, nên khôn ngoan hơn để khai báo tất cả các biến số của hàm ở đầu hàm. Chúng tôi đề nghị sử dụng một câu lệnh var var cho mỗi hàm. Điều này có thể bị từ chối với tùy chọn vars .

2

Lý do đã được mô tả.

Khuyến nghị là sử dụng hình thức này:

var myVar1 = document.getElementById("myDiv1"), 
    myVar2 = document.getElementById("myDiv2"); 

hay này:

var myVar1, myVar2; 
myVar1 = document.getElementById("myDiv1"); 
myVar2 = document.getElementById("myDiv2"); 

Nhưng điều này không trông rất đẹp, đặc biệt là nếu bạn muốn ghi lại vars.

Vì vậy, bạn chỉ có thể vô hiệu hóa cảnh báo này temporarly:

/*jslint vars: true*/ 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar1 = document.getElementById("myDiv1"); 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar2 = document.getElementById("myDiv2"); 
    /*jslint vars: false*/ 

Cảnh báo: hãy chắc chắn rằng điều này được thực hiện ở phía trên cùng của một hàm.

Tôi nghĩ rằng điều này được thực hiện vì jslint không thể xác định một cách đáng tin cậy nếu các vars được khai báo ở trên cùng của hàm hay không.

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