Return trong JavaScript là gì

Nhưng loại 'trả lại' thực sự là gì.

Nó không có loại, nó không phải là một giá trị.

Đang cố gắng typeof return; sẽ cung cấp cho bạn Unexpected token return.

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, trong khi dấu ngoặc đơn  có thể  được sử dụng để gọi hàm, ở đây chúng là một toán tử nhóm chứa một vài biểu thức được phân tách bằng a toán tử dấu phẩy .

Một minh chứng hữu ích hơn sẽ là:function add[a, b] { return [ [a + b], [a - b] ]; } console.log[add[2, 2]];

Đầu ra nào 0 vì kết quả của a + b bị bỏ qua [nó nằm trên LHS của toán tử dấu phẩy] và a - b Được trả lại.

Tôi hơi 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; trả về [không có LineTerminator tại đâ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 một câu lệnh return không nằm trong FunctionBody. Câu lệnh return khiến hàm dừng thực thi và trả về giá trị cho người gọi. Nếu Biểu thức bị bỏ qua, giá trị trả về không được xác định. Mặt khác, 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 xuất hiện, trả về [return, undefined, empty]. Đặt 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, vì thông số kỹ thuật, ví dụ của bạn đọc:

return [ GetValue[exprRef] ]

trong đó exprRef = console.log[a + b], console.log[arguments]

Theo thông số về toán tử dấu phẩy ...

Ngữ nghĩa

Biểu thức sản xuất: Biểu hiện, AssignExpression được đánh giá như sau:

... có nghĩa là mọi biểu thức sẽ được đánh giá cho đến khi 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ạn return [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 hiện biểu thức tiếp theo

3.] in arguments và vì console.log[] không chỉ định câu lệnh return

4.] Đánh giá để không xác định

5.] Sau đó được trả lại cho người gọi.

Vì vậy, câu trả lời đúng là, return không có loại, 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 xác định để cho phép bạn kết hợp nhiều biểu thức thành một dòng và được xác định bởi thông số kỹ thuật để trả về biểu thức được đánh giá của bất cứ điều gì cuối cùng trong danh sách của bạn.

Bạn vẫn không tin tôi? alert[foo[]]; function foo[]{ var foo = undefined + undefined; console.log[foo]; return undefined, console.log[1], 4; }

Chơi với mã đó tại đây và lộn xộn 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ỉ là undefined.

Đố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 được rằng mọi từ khóa trong JavaScript cuối cùng là một hàm không?

Một lần nữa, không. Hàm có định nghĩa rất cụ thể trong ngôn ngữ. Tôi sẽ không in lại ở đây vì câu trả lời này đã trở nên rất dài.

Kiểm tra những gì xảy ra khi bạn trả về các giá trị được ngoặc đơn:function foo[] { return [1, 2]; } console.log[foo[]];

Đưa ra câu trả lời 2, do đó, có vẻ như một danh sách các giá trị được phân tách bằng dấu phẩy ước tính cho phần tử cuối cùng trong danh sách.

Thực sự, dấu ngoặc đơn không liên quan ở đây, chúng được nhóm các hoạt động thay vì biểu thị một lệnh gọi hàm. Tuy nhiên, điều đáng ngạc nhiên là dấu phẩy là hợp pháp ở đây. Tôi tìm thấy một bài viết blog thú vị về cách xử lý dấu phẩy ở đây:

//javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/

return không phải là một hàm. Đó là tiếp tục của hàm mà nó xảy ra.

Hãy suy nghĩ về câu lệnh alert [2 * foo[bar]]; trong đó foo là tên của hàm. Khi bạn đánh giá nó, bạn sẽ thấy rằng bạn phải dành phần còn lại của câu lệnh trong giây lát để tập trung vào việc đánh giá foo[bar]. Bạn có thể hình dung phần bạn đặt sang một bên như alert [2 * _], với một khoảng trống để điền vào. Khi bạn biết giá trị của foo[bar] là gì, bạn chọn lại nó.

Thứ bạn đặt sang một bên là tiếp tục của cuộc gọi foo[bar].

Gọi return cung cấp một giá trị cho sự tiếp tục đó.

Khi bạn đánh giá một hàm bên trong foo, phần còn lại của foo đợi hàm đó giảm xuống một giá trị, sau đó foo chọn lại . Bạn vẫn có một mục tiêu để đánh giá foo[bar], nó chỉ bị tạm dừng.

Khi bạn đánh giá return bên trong foo, không có phần nào của foo chờ đợi một giá trị. return không giảm xuống một giá trị tại địa điểm bên trong foo nơi bạn đã sử dụng nó. Thay vào đó, nó làm cho toàn bộ cuộc gọifoo[bar] giảm xuống một giá trị và mục tiêu "đánh giá foo[bar]" được coi là hoàn thành và bị thổi bay.

Mọi người thường không nói với bạn về việc tiếp tục khi bạn mới lập trình. Họ nghĩ về nó như một chủ đề nâng cao, chỉ vì có đang một số điều rất tiên tiến mà cuối cùng mọi người làm với các phần tiếp theo. Nhưng sự thật là, bạn đang sử dụng tất cả chúng, mỗi khi bạn gọi một chức năng.

return ở đây là cá trích đỏ. Có lẽ thú vị là biến thể sau đây:function add[a, b] { return [ console.log[a + b], console.log[arguments] ]; } console.log[add[2, 2]];

đầu ra là dòng cuối cùngundefined

như chức năng không thực sự trả lại bất cứ điều gì. [Nó sẽ trả về giá trị trả về của thứ hai console.log, nếu nó có một cái].

Vì nó là, mã giống hệt vớifunction add[a, b] { console.log[a + b]; console.log[arguments]; } console.log[add[2, 2]];

Một cách thú vị để hiểu câu lệnh return là thông qua toán tử void Hãy xem mã nàyvar console = { log: function[s] { document.getElementById["console"].innerHTML += s + "
" } } function funReturnUndefined[x,y] { return [ void[x+y] ]; } function funReturnResult[x,y] { return [ [x+y] ]; } console.log[ funReturnUndefined[2,3] ]; console.log[ funReturnResult[2,3] ];

Vì câu lệnh return nhận một đối số là [[expression]] Và trả lại điều này cho người gọi trên ngăn xếp, tức là arguments.callee.caller, Sau đó, nó sẽ thực thi void[expression] và sau đó trả về undefined đó là đánh giá của toán tử void.

Video liên quan

Chủ Đề