Có phải mọi hàm Javascript đều phải trả về một giá trị không?


99

Tôi đang sử dụng Netbeans để thêm các nhận xét giống như chuyên nghiệp cho từng chức năng, tôi viết. Vì vậy, tôi bắt đầu mỗi nó /**và sau đó tôi nhấn Enterđể cho Netbeans thực hiện sơ đồ nhận xét mặc định cho chức năng sau.

Cho đến bây giờ, tôi chỉ sử dụng điều này cho ngôn ngữ PHP và trong trường hợp này, Netbeans luôn chỉ thêm @returns {type}một phần trong lược đồ bình luận, nếu sau hàm PHP thực sự bao gồm returncâu lệnh. Trên cái gọi là "thủ tục" (các hàm không trả về bất kỳ giá trị nào), phần này đã bị thiếu.

Hôm nay tôi đã thử điều tương tự cho hàm Javascript và Netbeans đã thêm @returns {undefined}một phần vào lược đồ bình luận mặc dù hàm sau không trả về bất kỳ thứ gì.

Điều này làm tôi bối rối. Netbeans đề xuất theo cách này, rằng mọi hàm Javascript phải trả về bất kỳ thứ gì? Tôi nên làm gì? Bỏ qua (hoặc xóa) phần lược đồ nhận xét đó hoặc làm theo gợi ý (nếu đây là gợi ý) và thêm return false;vào cuối hàm như vậy, mặc dù nó vô ích đối với tôi?


6
Nếu không có giá trị trả về nào được chỉ định, JavaScript sẽ trả về undefined. Trong nhiều ngôn ngữ, kết quả của câu lệnh cuối cùng được trả về (hữu ích hơn, IMO). Chúng được gọi là lợi nhuận ngầm định .
Zaz

Điều này có trả lời câu hỏi của bạn không? Tôi có phải trả lại một cái gì đó trong hàm javascript không?
cOborski

Câu trả lời:


189

Câu trả lời ngắn gọn là không.

Các thực trả lời là có: động cơ JS phải được thông báo rằng một số chức năng đã kết thúc kinh doanh của mình, được thực hiện bởi các chức năng trở về một cái gì đó. Đây cũng là lý do tại sao, thay vì "kết thúc" , một hàm được cho là "đã trả về" .
Một hàm thiếu câu lệnh trả về rõ ràng sẽ trả về undefined, giống như hàm C (++) không có giá trị trả về được cho biết (và chữ ký của nó phản ánh điều này) để trả về void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

Ngoài ra, trong JS, giống như trong hầu hết mọi ngôn ngữ, bạn có thể thoải mái bỏ qua giá trị trả về của một hàm, điều này được thực hiện rất nhiều:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

Ở một số mức rất thấp, lợi nhuận được chuyển thành một bước nhảy nào đó. Nếu một hàm thực sự không trả về cả, sẽ không có cách nào để biết cái gì và khi nào gọi hàm tiếp theo hoặc gọi các trình xử lý sự kiện và những thứ tương tự.

Vì vậy, tóm lại: Không, một hàm JS không cần trả về bất cứ thứ gì trong thời gian mã của bạn. Nhưng theo như các công cụ JS có liên quan: một hàm luôn trả về một cái gì đó, có thể là một cách rõ ràng thông qua một returncâu lệnh hoặc ngầm định. Nếu một hàm trả về ngầm định, giá trị trả về của nó sẽ luôn không được xác định.


5
Tôi không tin rằng C ++ (hoặc C) "trả về một khoảng trống". Thẻ "void" cho biết nó không trả về bất cứ thứ gì. Đó là một điểm nhỏ và không liên quan gì đến câu hỏi được hỏi.
Jay

2
Nó không thực sự trả về void, không trả về gì, nhưng chữ ký của nó phản ánh điều này thông qua voidkiểu trả về.
Elias Van Ootegem

có bất kỳ lợi ích hiệu suất nào cho lợi nhuận rõ ràng so với ẩn?
4 giờ 1 phút

@ 4m1r: không biết nữa, chắc tùy động cơ. Nếu có sự khác biệt về hiệu suất, rất có thể nó là không đáng kể. trở lại ẩn return;có lẽ chỉ hữu ích nếu bạn cần trở về sớm. việc viết return undefined;có thể tạo ra các kết quả khác nhau nếu phân undefinedgiải thành một giá trị khác. Hầu hết (nếu không phải tất cả) các trình duyệt sẽ ném ra một lỗi khi bạn cố gắng để phân công lại không xác định, nhưng về mặt lý thuyết, có thể đây là một ví dụ sử dụng Node.js
Elias Văn Ootegem

1
@SebastianLasse: Tôi đã đề cập đến voidbằng các ngôn ngữ khác (như C), nơi bạn có thể có các hàm như void do_someting(int *arg), nhưng bạn không thể có biến với kiểu void. Trong C, voidkhông phải là thực sự là một loại, do đó, những chức năng không trở lại bất cứ điều gì, họ chỉ nhảy
Elias Văn Ootegem

25

Không, trả lại là không cần thiết.

Nhưng không có lợi nhuận thực sự trả lạiundefined


6

Có phải mọi hàm Javascript đều phải trả về một giá trị không?

Không, họ không. Đúng là sâu trong thông số kỹ thuật, tất cả chúng đều hơi khác nhau:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... nhưng kết quả của gọi mỗi người trong số họ là như nhau: undefined. Vì vậy, trong điều kiện thực dụng:

  1. Bạn không cần phải viết a return, bạn có thể để việc thực thi mã "nằm ở cuối" của hàm
  2. Nếu bạn đang trở lại undefined, đặc biệt, bạn chỉ cần viếtreturn;
  3. Khi gọi một hàm, bạn không thể biết (trong mã) liệu quá trình thực thi không ở cuối, kết thúc bằng return;hay kết thúc bằng return undefined;; tất cả chúng đều giống hệt mã gọi điện của bạn

Re the spec: Cụ thể, khi việc thực thi của một hàm không kết thúc, trong spec đó là hoàn thành "bình thường"; nhưng return;return value;đều là các hoàn thành "trả về" với một giá trị được liên kết ( undefined), giá trị này (hơi khác một chút). Nhưng sự khác biệt bị loại bỏ bởi ngữ nghĩa của việc gọi một hàm , có nghĩa là:

...

  1. Nếu là kết quả . [[Type]] return, trả về NormalCompletion ( kết quả . [[Giá trị]]).
  2. ReturnIfAbrupt ( kết quả ).
  3. Trả về NormalCompletion ( không xác định ).

Vì vậy, không có sự khác biệt nào bạn có thể quan sát trong mã.


2

Không, bạn không cần phải trả về thứ gì đó cho mọi hàm. Nó là tùy chọn và tùy thuộc vào cách bạn viết mã logic của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.