2011-09-15 35 views
22

Tại sao JSLint lại phàn nàn nếu một cái gì đó sử dụng một hàm chưa được xác định? Vấn đề là hàm được định nghĩa - và nếu cái gì đó gọi hàm đó, hàm đó tồn tại và mọi thứ sẽ hoạt động.Lỗi jsLint: “somefunction() đã được sử dụng trước khi được xác định”

Hãy nhìn vào mã bên dưới:

function foo() 
{ 
    // calls bar() 
}; 

function bar() 
{ 
    // calls foo() 
}; 

Không có cách nào để tổ chức thực hiện 2 phương pháp theo cách như vậy mà nó sẽ làm cho JSLint hạnh phúc. Làm cách nào để giải quyết vấn đề này?

Trả lời

13

Xem câu trả lời này:

Contending with JS "used before defined" and Titanium Developer

Về cơ bản, nếu bạn sử dụng các hình thức foo = function() { ... }, bạn có thể khai var foo, bar; ở đầu để tránh những lỗi JSLint.

+5

Nhưng đó chỉ là một chút khác biệt so với 'hàm foo()', là biểu thức hàm và tất cả. Thêm vào đó, khai báo 'var foo, bar' ở trên cùng là thừa không cần cẩu. Vì vậy, trong ngắn hạn, 'var foo = function() ..., var bar = function() ...' sẽ làm tốt về mặt kỹ thuật. Ngoài ra, tôi nghĩ rằng, xem xét rằng các khai báo hàm được nạp trước bất cứ điều gì khác - JSLint nên sửa chữa các công cụ của họ rồi. – ZenMaster

+8

@ZenMaster: Một ngã ba của 'jslint', [' jsHint'] (http://www.jshint.com/docs/), giải quyết điều này cho phép bạn đặt '" latedef ": false' trong các tùy chọn. (Nó không ảnh hưởng đến tên biến, chỉ tên hàm.) –

+1

Câu trả lời này sẽ ngắt mã dựa trên hàm định nghĩa cẩu ~ –

15

JSLint không thể xử lý điều này theo như tôi biết, nhưng JSHint, dựa trên JSLint, giải quyết vấn đề này một cách thích hợp.

Chỉ cần sử dụng thuộc tính "latedef" và đặt thành "false". Trong trường hợp bạn vẫn muốn phát hiện các loại định nghĩa biến có vấn đề này, nhưng muốn sử dụng các biểu thức hàm và cho phép sử dụng các hàm này, bạn có thể đặt "latedef": "nofunc".

Hãy khám phá here.

+0

Một lưu ý - "nofunc" giá trị cho tùy chọn "latedef" giúp tránh việc kiểm tra các khai báo hàm (không phải biểu thức). – Alexei

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