Tôi hơi bị sốc khi không có ai ở đây trực tiếp tham khảo thông số kỹ thuật :
12.9 Câu lệnh return Cú pháp ReturnStatement: return; return [không có LineTerminator ở đây] Biểu thức;
Ngữ nghĩa
Một chương trình ECMAScript được coi là không chính xác về mặt cú pháp nếu nó chứa câu lệnh trả về không nằm trong FunctionBody. Câu lệnh return khiến một hàm ngừng thực thi và trả về một giá trị cho trình gọi. Nếu Biểu thức bị bỏ qua, giá trị trả về là không xác định. Nếu không, giá trị trả về là giá trị của Biểu thức.
ReturnStatement được đánh giá như sau:
Nếu Biểu thức không có mặt, hãy quay lại (return, undefined, empty)
. Hãy exprRef
là kết quả của việc đánh giá Biểu thức. Trả lại (return, GetValue(exprRef), empty)
.
Vì vậy, do thông số kỹ thuật, ví dụ của bạn có nội dung:
return ( GetValue(exprRef) )
Ở đâu
exprRef = console.log(a + b), console.log(arguments)
Mà theo thông số kỹ thuật về toán tử dấu phẩy ...
Ngữ nghĩa
Biểu thức sản xuất: Expression, AssignmentExpression được đánh giá như sau:
Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
... có nghĩa là mọi biểu thức sẽ được đánh giá cho đến mục cuối cùng trong danh sách dấu phẩy, trở thành biểu thức gán. Vì vậy, mã của bạnreturn (console.log(a + b) , console.log(arguments))
sẽ
1.) in kết quả của a + b
2.) Không còn gì để thực thi, vì vậy hãy thực thi biểu thức tiếp theo
3.) in arguments
, và bởi vìconsole.log()
không chỉ định câu lệnh trả về
4.) Đánh giá đến không xác định
5.) Sau đó được trả lại cho người gọi.
Vì vậy, câu trả lời chính xác là, return
không có kiểu, nó chỉ trả về kết quả của một số biểu thức.
Đối với câu hỏi tiếp theo:
Vì vậy, chúng ta có thể chuyển các biểu thức được phân tách bằng dấu phẩy vào câu lệnh return. Đây có phải là một chức năng?
Không. Dấu phẩy trong JavaScript là một toán tử, được định nghĩa để cho phép bạn kết hợp nhiều biểu thức thành một dòng duy nhất và được xác định bởi đặc tả để trả về biểu thức được đánh giá của bất kỳ thứ gì cuối cùng trong danh sách của bạn.
Bạn vẫn không tin tôi?
<script>
alert(foo());
function foo(){
var foo = undefined + undefined;
console.log(foo);
return undefined, console.log(1), 4;
}
</script>
Chơi với mã đó ở đây và gây rối với giá trị cuối cùng trong danh sách. Nó sẽ luôn trả về giá trị cuối cùng trong danh sách, trong trường hợp của bạn, nó chỉ xảy raundefined.
Đối với câu hỏi cuối cùng của bạn,
Và bắt đầu với điều này, chúng ta có thể đoán rằng mọi từ khóa trong JavaScript cuối cùng đều là một hàm không?
Một lần nữa, không. Các hàm có một định nghĩa rất cụ thể trong ngôn ngữ. Tôi sẽ không in lại nó ở đây vì câu trả lời này đã quá dài.