2013-07-16 37 views
20

Nếu tôi có một cái gì đó như thế này:chức năng rỗng trong Javascript

var blah = function() { }; 

và sau đó trong mã blah đang được sử dụng, gợi ý JSLint nói rằng loại bỏ các khối rỗng là gì?

+0

Có thể vì khối chức năng đó ('{}') không làm gì cả. – acdcjunior

+6

Tôi không biết ... Tôi có thể nghĩ về những tình huống có ý nghĩa. 'myClass.overridableFunction = function() {};' sẽ không ném một lỗi nếu bạn gọi 'overridableFunction()', và sau đó một phần mở rộng của lớp có thể thực hiện nó thêm. – Katana314

+0

Đó hoặc chức năng 'noop'. Nó xảy ra. –

Trả lời

0

này

{ 
    ... 
} 

được coi là một khối mã và gợi ý là để cho bạn biết rằng nó là rỗng (không có lệnh trong nó). Bạn không phải loại bỏ nó mặc dù, như @ Katana314 nói, nó có thể là cố ý.

+1

Điều này sẽ không trả về một 'hàm', nó sẽ chỉ trả về một' đối tượng mới() '(đó là một phím tắt) và hai hàm này hoàn toàn khác nhau. Cách duy nhất để trả về một hàm rỗng là sử dụng 'var myEmptyMethod = function() {}'. Để biết thêm thông tin, hãy xem [Giải thích Douglas Crockford] (http://javascript.crockford.com/code.html#bonus) – RPDeshaies

4

Rất nhiều người kiểm tra mã kiểm tra loại điều này. Điều đó không có nghĩa là bạn nên không bao giờ có các khối mã trống. Đôi khi có lý do hợp lệ để có chúng. Nhưng nó thường có nghĩa là lập trình viên chỉ quên ghi thực hiện. :)

Điều tôi muốn làm là đặt chú thích vào phần thân hàm, giải thích lý do tại sao nó trống. Điều này sẽ ngăn chặn các cảnh báo, nhưng nó có thể không phụ thuộc vào việc kiểm tra mã xem xét một khối mã với một bình luận "rỗng".

var blah = function() { /* empty because ... */ }; 
+11

Một quy ước tốt, mặc dù jshint vẫn sẽ phàn nàn, vì Crocker. – dfreeman

+1

@dfreeman "vì Crocker" haha ​​ – Michael

+3

Điều này rất khó chịu. Mã riêng của Crocker cho Object.create sử dụng một khối rỗng và sẽ không vượt qua JSLint. Anh ta cần phải tìm ra khán giả là ai. Nó có phải được sử dụng như là một kiểm tra tiền sản xuất, hoặc như là một kiểm tra sanity trong chu kỳ phát triển? Bởi vì ngay bây giờ, anh thậm chí còn bối rối hơn bình thường. –

23

Tôi không biết những gì jsLint nghĩ nhưng nếu điều này là một vấn đề và bạn cần một giải pháp thì bạn có thể làm điều gì đó như sau:

var blah = function() { return undefined; }; // or just return; 

Cập nhật: Tôi nghĩ rằng, Bergi đoán là đúng vì, trên trang web jslint trong phần Required Blocks:

JSLint hy vọng rằng nếu, trong khi, làm và cho báo cáo sẽ được thực hiện với khối {có nghĩa là, với câu lệnh kèm theo trong dấu ngoặc ôm} .JavaScript cho phép một nếu được viết như thế này: if (điều kiện) tuyên bố; Hình thức đó là được biết là đóng góp cho những sai lầm trong các dự án có nhiều lập trình viên là làm việc trên cùng một mã. Đó là lý do tại sao JSLint hy vọng việc sử dụng một khối :

if (condition) { statements; } 

Kinh nghiệm cho thấy mẫu này là kiên cường hơn.

Vì vậy, có thể chỉ kiểm tra các khối trống { } và vô hiệu hóa chức năng trống.

+9

Hoặc chỉ 'trả lại; '? – Ian

+0

@Ian, Yep, nó hoàn toàn không được xác định. –

+3

Nếu bạn đang sử dụng jQuery thì bạn cũng có thể gọi $ .noop() thay vì trả lại; –

3

Nếu bạn có ý định sử dụng các chức năng như một nhà xây dựng với new điều hành:

// Returns the instance that was just created with the new operator. 
var ClassLikeFunction = function(){ 
    return this; 
}; 

Mặt khác, nếu là cố ý một hàm trống không có giá trị trả về:

// Returns the same value as a function that returned nothing. 
var blankFunction = function(){ 
    return undefined; 
}; 
5

Nếu bạn đang hỏi tùy chọn JsLint nào sẽ tắt cảnh báo này là: "debug: true"

Kỳ lạ, tài liệu không đề cập đến hành vi này:

"Tuyên bố trình gỡ lỗi khoan dung" | gỡ lỗi | Cần cho phép đúng nếu trình gỡ lỗi. Đặt tùy chọn này thành false trước khi đi vào sản xuất.

Nhưng nếu bạn nhìn vào the code, bạn có thể thấy rằng nó sẽ không cảnh báo bạn với các tùy chọn gỡ lỗi thiết lập là true:

function block(kind) { 
    // A block is a sequence of statements wrapped in braces. 

    ... 

    if (kind !== 'catch' && array.length === 0 && !option.debug) { 
     curly.warn('empty_block'); 
    } 
    ... 
} 
0

Sử dụng các biểu thức lambda:

const blah =() => void 0; 

Điều này sẽ làm rõ rằng blah là một hàm trống trả về undefined.

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