Nói chung, một hàm là "chương trình con" có thể được gọi bằng mã bên ngoài [hoặc bên trong trong trường hợp đệ quy] cho hàm. Giống như chính chương trình, một hàm bao gồm một chuỗi các câu lệnh gọi là cơ thể chức năng. Các giá trị có thể được truyền đến một hàm và hàm sẽ trả về một giá trị. Trong JavaScript, các chức năng là các đối tượng hạng nhất, bởi vì chúng có thể có các thuộc tính và phương thức giống như bất kỳ đối tượng nào khác. Điều phân biệt chúng với các đối tượng khác là các chức năng có thể được gọi. Tóm lại, chúng là đối tượng
0.const myFunction = function [] {
statements
}
Để biết thêm các ví dụ và giải thích, hãy xem Hướng dẫn JavaScript về các chức năng.
Sự mô tả
Mỗi chức năng trong JavaScript là một đối tượng
const myFunction = function [] {
statements
}
0. Xem const myFunction = function [] {
statements
}
0 để biết thông tin về các thuộc tính và phương thức của các đối tượng const myFunction = function [] {
statements
}
0.Để trả về một giá trị khác với mặc định, một hàm phải có câu lệnh
const myFunction = function [] {
statements
}
4 chỉ định giá trị để trả về. Một hàm không có câu lệnh trả về sẽ trả về một giá trị mặc định. Trong trường hợp hàm tạo được gọi với từ khóa const myFunction = function [] {
statements
}
5, giá trị mặc định là giá trị của tham số const myFunction = function [] {
statements
}
6 của nó. Đối với tất cả các chức năng khác, giá trị trả về mặc định là const myFunction = function [] {
statements
}
7.Các tham số của lệnh gọi hàm là các đối số của hàm. Các đối số có thể được truyền theo giá trị [trong trường hợp các giá trị nguyên thủy] hoặc theo tham chiếu [trong trường hợp của các đối tượng]. Điều này có nghĩa là nếu một hàm chỉ định một tham số loại nguyên thủy, giá trị sẽ không thay đổi bên ngoài hàm. Trong trường hợp tham số loại đối tượng, nếu các thuộc tính của nó bị đột biến, sự thay đổi sẽ tác động bên ngoài hàm. Xem ví dụ sau:
/* Declare the function 'myFunc' */
function myFunc[theObject] {
theObject.brand = "Toyota";
}
/*
* Declare variable 'mycar';
* create and initialize a new Object;
* assign reference to it to 'mycar'
*/
const mycar = {
brand: "Honda",
model: "Accord",
year: 1998
};
/* Logs 'Honda' */
console.log[mycar.brand];
/* Pass object reference to the function */
myFunc[mycar];
/*
* Logs 'Toyota' as the value of the 'brand' property
* of the object, as changed to by the function.
*/
console.log[mycar.brand];
Từ khóa
const myFunction = function [] {
statements
}
6 không đề cập đến chức năng hiện đang thực hiện, vì vậy bạn phải tham khảo các đối tượng const myFunction = function [] {
statements
}
0 theo tên, ngay cả trong phần thân chức năng.Xác định chức năng
Có một số cách để xác định các chức năng:
Các tuyên bố chức năng
Có một cú pháp đặc biệt để khai báo các chức năng [xem tuyên bố chức năng để biết chi tiết]:
function name[[param[, param[, ... param]]]] {
statements
}
const myFunction = function namedFunction[] {
statements
}
0Tên chức năng.
const myFunction = function namedFunction[] {
statements
}
1Tên của một đối số sẽ được chuyển đến hàm.
const myFunction = function namedFunction[] {
statements
}
2Các tuyên bố bao gồm cơ thể của chức năng.
Biểu thức chức năng
Một biểu thức chức năng tương tự và có cùng cú pháp như một khai báo hàm [xem biểu thức chức năng để biết chi tiết]. Một biểu thức chức năng có thể là một phần của biểu thức lớn hơn. Người ta có thể xác định các biểu thức chức năng "được đặt tên" [ví dụ tên của biểu thức có thể được sử dụng trong ngăn xếp cuộc gọi] hoặc các biểu thức chức năng "ẩn danh". Các biểu thức chức năng không được nâng lên vào đầu phạm vi, do đó chúng không thể được sử dụng trước khi chúng xuất hiện trong mã.
function [name][[param[, param[, ... param]]]] {
statements
}
const myFunction = function namedFunction[] {
statements
}
0Tên chức năng. Có thể được bỏ qua, trong trường hợp đó hàm được gọi là hàm ẩn danh.
const myFunction = function namedFunction[] {
statements
}
1Tên của một đối số sẽ được chuyển đến hàm.
const myFunction = function namedFunction[] {
statements
}
2Các tuyên bố bao gồm cơ thể của chức năng.
Biểu thức chức nănganonymous function expression [the
const myFunction = function namedFunction[] {
statements
}
0 is not used]: const myFunction = function [] {
statements
}
Một biểu thức chức năng tương tự và có cùng cú pháp như một khai báo hàm [xem biểu thức chức năng để biết chi tiết]. Một biểu thức chức năng có thể là một phần của biểu thức lớn hơn. Người ta có thể xác định các biểu thức chức năng "được đặt tên" [ví dụ tên của biểu thức có thể được sử dụng trong ngăn xếp cuộc gọi] hoặc các biểu thức chức năng "ẩn danh". Các biểu thức chức năng không được nâng lên vào đầu phạm vi, do đó chúng không thể được sử dụng trước khi chúng xuất hiện trong mã.named function expression:
const myFunction = function namedFunction[] {
statements
}
Tên chức năng. Có thể được bỏ qua, trong trường hợp đó hàm được gọi là hàm ẩn danh.
Dưới đây là một ví dụ về biểu thức chức năng ẩn danh [
const myFunction = function namedFunction[] {
statements
}
0 không được sử dụng]:Cũng có thể cung cấp một tên bên trong định nghĩa để tạo biểu thức chức năng được đặt tên:
[function [] {
statements
}][];
Một trong những lợi ích của việc tạo biểu thức chức năng được đặt tên là trong trường hợp chúng tôi gặp phải lỗi, dấu vết ngăn xếp sẽ chứa tên của hàm, giúp dễ dàng tìm thấy nguồn gốc của lỗi.
Như chúng ta có thể thấy, cả hai ví dụ không bắt đầu với từ khóa const myFunction = function namedFunction[] {
statements
}
7. Các câu lệnh liên quan đến các chức năng không bắt đầu với const myFunction = function namedFunction[] {
statements
}
7 là các biểu thức chức năng.
const myFunction = function namedFunction[] {
statements
}
const myFunction = function namedFunction[] {
statements
}
Khi các chức năng chỉ được sử dụng một lần, một mẫu phổ biến là một iife [ngay lập tức được gọi biểu thức chức năng].
function* name[[param[, param[, ... param]]]] {
statements
}
const myFunction = function namedFunction[] {
statements
}
0Tên chức năng.
const myFunction = function namedFunction[] {
statements
}
1Tên của một đối số sẽ được chuyển đến hàm.
const myFunction = function namedFunction[] {
statements
}
2Các tuyên bố bao gồm cơ thể của chức năng.
Biểu thức chức năng
Một biểu thức chức năng tương tự và có cùng cú pháp như một khai báo hàm [xem biểu thức chức năng để biết chi tiết]. Một biểu thức chức năng có thể là một phần của biểu thức lớn hơn. Người ta có thể xác định các biểu thức chức năng "được đặt tên" [ví dụ tên của biểu thức có thể được sử dụng trong ngăn xếp cuộc gọi] hoặc các biểu thức chức năng "ẩn danh". Các biểu thức chức năng không được nâng lên vào đầu phạm vi, do đó chúng không thể được sử dụng trước khi chúng xuất hiện trong mã.
function* [name][[param[, param[, ... param]]]] {
statements
}
const myFunction = function namedFunction[] {
statements
}
0Tên chức năng. Có thể được bỏ qua, trong trường hợp đó hàm được gọi là hàm ẩn danh.
const myFunction = function namedFunction[] {
statements
}
1Tên của một đối số sẽ được chuyển đến hàm.
const myFunction = function namedFunction[] {
statements
}
2Các tuyên bố bao gồm cơ thể của chức năng.
Biểu thức chức năng
Một biểu thức chức năng tương tự và có cùng cú pháp như một khai báo hàm [xem biểu thức chức năng để biết chi tiết]. Một biểu thức chức năng có thể là một phần của biểu thức lớn hơn. Người ta có thể xác định các biểu thức chức năng "được đặt tên" [ví dụ tên của biểu thức có thể được sử dụng trong ngăn xếp cuộc gọi] hoặc các biểu thức chức năng "ẩn danh". Các biểu thức chức năng không được nâng lên vào đầu phạm vi, do đó chúng không thể được sử dụng trước khi chúng xuất hiện trong mã.
[[param[, param]]] => {
statements
}
param => expression
[param] => expression
const myFunction = function namedFunction[] {
statements
}
1Tên của một đối số. Đối số không cần phải được chỉ định với
[function [] {
statements
}][];
9. Đối với chính xác một đối số, dấu ngoặc đơn không bắt buộc. [như function* name[[param[, param[, ... param]]]] {
statements
}
0]const myFunction = function namedFunction[] {
statements
}
2 hoặc function* name[[param[, param[, ... param]]]] {
statements
}
2Nhiều tuyên bố cần được đặt trong ngoặc. Một biểu thức duy nhất không yêu cầu dấu ngoặc. Biểu thức cũng là giá trị trả về ngầm của hàm.
Hàm tạo chức năng
Lưu ý: Sử dụng hàm tạo
0 để tạo các chức năng không được khuyến nghị vì nó cần cơ thể chức năng như một chuỗi có thể ngăn chặn một số tối ưu hóa động cơ JS và cũng có thể gây ra các vấn đề khác. Using the const myFunction = function [] {
statements
}
const myFunction = function [] {
statements
}
0 constructor to create
functions is not recommended since it needs the function body as a string which may prevent some JS engine optimizations and can also cause other problems. Vì tất cả các đối tượng khác, các đối tượng
const myFunction = function [] {
statements
}
0 có thể được tạo bằng toán tử const myFunction = function [] {
statements
}
5:new Function [arg1, arg2, ... argN, functionBody]
function* name[[param[, param[, ... param]]]] {
statements
}
60 hoặc nhiều tên được sử dụng bởi hàm như các tham số chính thức. Mỗi người phải là một định danh JavaScript thích hợp.
function* name[[param[, param[, ... param]]]] {
statements
}
7Một chuỗi chứa các câu lệnh JavaScript bao gồm cơ thể chức năng.
Gọi hàm xây dựng
const myFunction = function [] {
statements
}
0 làm hàm [không sử dụng toán tử const myFunction = function [] {
statements
}
5] có tác dụng tương tự như gọi nó như một hàm tạo.Các hàm tạo GeneratorFunction
Lưu ý:
0 không phải là một đối tượng toàn cầu, nhưng có thể được lấy từ thể hiện chức năng của máy phát [xem function* [name][[param[, param[, ... param]]]] {
statements
}
0 để biết thêm chi tiết]. function* [name][[param[, param[, ... param]]]] {
statements
}
function* [name][[param[, param[, ... param]]]] {
statements
}
0 is not a global object, but could be obtained from generator function instance [see function* [name][[param[, param[, ... param]]]] {
statements
}
0 for
more detail]. Lưu ý: Sử dụng hàm tạo
0 để tạo các chức năng không được khuyến nghị vì nó cần cơ thể chức năng như một chuỗi có thể ngăn chặn một số tối ưu hóa động cơ JS và cũng có thể gây ra các vấn đề khác. Using the function* [name][[param[, param[, ... param]]]] {
statements
}
function* [name][[param[, param[, ... param]]]] {
statements
}
0 constructor to create functions is not recommended since it needs the function body as a string which may prevent some JS engine optimizations and can also cause other problems. Như tất cả các đối tượng khác, các đối tượng
function* [name][[param[, param[, ... param]]]] {
statements
}
0 có thể được tạo bằng toán tử const myFunction = function [] {
statements
}
5:function name[[param[, param[, ... param]]]] {
statements
}
0function* name[[param[, param[, ... param]]]] {
statements
}
60 hoặc nhiều tên được sử dụng bởi hàm làm tên đối số chính thức. Mỗi người phải là một chuỗi phù hợp với các quy tắc cho một định danh JavaScript hợp lệ hoặc danh sách các chuỗi đó được phân tách bằng dấu phẩy; Ví dụ
function* [name][[param[, param[, ... param]]]] {
statements
}
6, function* [name][[param[, param[, ... param]]]] {
statements
}
7 hoặc function* [name][[param[, param[, ... param]]]] {
statements
}
8.function* name[[param[, param[, ... param]]]] {
statements
}
7Một chuỗi chứa các câu lệnh JavaScript bao gồm định nghĩa hàm.
Gọi hàm xây dựng
function* [name][[param[, param[, ... param]]]] {
statements
}
0 dưới dạng hàm [mà không sử dụng toán tử const myFunction = function [] {
statements
}
5] có tác dụng tương tự như gọi nó như một hàm tạo.Tham số chức năng
Tham số mặc định
Các tham số chức năng mặc định cho phép các tham số chính thức được khởi tạo với các giá trị mặc định nếu không có giá trị hoặc
const myFunction = function [] {
statements
}
7 được truyền. Để biết thêm chi tiết, xem các tham số mặc định.Tham số nghỉ
Cú pháp tham số REST cho phép biểu thị số lượng đối số không xác định dưới dạng một mảng. Để biết thêm chi tiết, xem các tham số REST.
Đối tượng đối số
Bạn có thể tham khảo các đối số của hàm trong hàm bằng cách sử dụng đối tượng
[[param[, param]]] => {
statements
}
param => expression
[param] => expression
3. Xem đối số.[[param[, param]]] => {
statements
}
param => expression
[param] => expression
3Một đối tượng giống như mảng chứa các đối số được truyền cho chức năng hiện đang thực hiện.
[[param[, param]]] => {
statements
}
param => expression
[param] => expression
5Chức năng hiện đang thực hiện.
[[param[, param]]] => {
statements
}
param => expression
[param] => expression
6Số lượng đối số được truyền cho hàm.
Xác định chức năng phương thức
Chức năng Getter và Setter
Bạn có thể xác định Getters [Phương thức Accessor] và Setters [Phương thức đột biến] trên bất kỳ đối tượng tích hợp tiêu chuẩn hoặc đối tượng do người dùng xác định hỗ trợ bổ sung các thuộc tính mới. Cú pháp để xác định getters và setters sử dụng cú pháp theo nghĩa đen của đối tượng.
lấyLiên kết một thuộc tính đối tượng với một hàm sẽ được gọi khi thuộc tính đó được tra cứu.
bộLiên kết một thuộc tính đối tượng với một hàm được gọi khi có một nỗ lực để đặt thuộc tính đó.
Phương pháp định nghĩa cú pháp
Trong các chữ cái đối tượng, bạn có thể xác định các phương thức riêng trong cú pháp ngắn hơn, tương tự như getters và setters. Xem định nghĩa phương pháp để biết thêm thông tin.
function name[[param[, param[, ... param]]]] {
statements
}
1Constructor so với khai báo so với biểu thức
So sánh những điều sau:
Một hàm được xác định với hàm tạo
const myFunction = function [] {
statements
}
0 được gán cho biến [[param[, param]]] => {
statements
}
param => expression
[param] => expression
8:function name[[param[, param[, ... param]]]] {
statements
}
2Tuyên bố chức năng của một hàm có tên
[[param[, param]]] => {
statements
}
param => expression
[param] => expression
8:function name[[param[, param[, ... param]]]] {
statements
}
3Biểu thức chức năng của hàm ẩn danh được gán cho biến
[[param[, param]]] => {
statements
}
param => expression
[param] => expression
8:function name[[param[, param[, ... param]]]] {
statements
}
4Biểu thức chức năng của hàm có tên
new Function [arg1, arg2, ... argN, functionBody]
1 được gán cho biến [[param[, param]]] => {
statements
}
param => expression
[param] => expression
8:function name[[param[, param[, ... param]]]] {
statements
}
5Sự khác biệt
Tất cả đều làm điều tương tự, với một vài sự khác biệt tinh tế:
Có một sự khác biệt giữa tên hàm và biến mà hàm được gán cho. Tên hàm không thể được thay đổi, trong khi biến hàm được gán cho có thể được chỉ định lại. Tên chức năng chỉ có thể được sử dụng trong cơ thể của chức năng. Cố gắng sử dụng nó bên ngoài cơ thể của chức năng dẫn đến một lỗi [hoặc nhận được một giá trị khác, nếu cùng một tên được khai báo ở nơi khác]. Ví dụ:
function name[[param[, param[, ... param]]]] {
statements
}
6Tên hàm cũng xuất hiện khi hàm được tuần tự hóa thông qua phương thức
new Function [arg1, arg2, ... argN, functionBody]
3 của nó.Mặt khác, biến mà hàm được gán cho chỉ giới hạn theo phạm vi của nó, được đảm bảo bao gồm phạm vi mà hàm được khai báo.
Như ví dụ
new Function [arg1, arg2, ... argN, functionBody]
4 cho thấy, tên hàm có thể khác với biến mà hàm được gán cho. Họ không có liên quan đến nhau. Một khai báo chức năng cũng tạo ra một biến có cùng tên với tên hàm. Do đó, không giống như các biểu thức được xác định bởi các biểu thức chức năng, các hàm được xác định bởi các khai báo chức năng có thể được truy cập bằng tên của chúng trong phạm vi mà chúng được xác định, cũng như trong cơ thể của chính chúng.Một hàm được xác định bởi
new Function [arg1, arg2, ... argN, functionBody]
5 sẽ tự động lắp ráp nguồn của nó, có thể quan sát được khi bạn tuần tự hóa nó. Ví dụ: new Function [arg1, arg2, ... argN, functionBody]
6 đưa ra:function name[[param[, param[, ... param]]]] {
statements
}
7Đây là nguồn thực tế được sử dụng để biên dịch hàm. Tuy nhiên, mặc dù hàm tạo
new Function [arg1, arg2, ... argN, functionBody]
7 sẽ tạo chức năng với tên new Function [arg1, arg2, ... argN, functionBody]
8, tên này không được thêm vào phạm vi của cơ thể. Cơ thể chỉ có quyền truy cập vào các biến toàn cầu. Ví dụ: sau đây sẽ dẫn đến lỗi:
function name[[param[, param[, ... param]]]] {
statements
}
8Không giống như các hàm được xác định bởi các biểu thức chức năng hoặc bởi hàm tạo
const myFunction = function [] {
statements
}
0, một hàm được xác định bởi khai báo hàm có thể được sử dụng trước khi khai báo hàm. Ví dụ:function name[[param[, param[, ... param]]]] {
statements
}
9Một hàm được xác định bởi một biểu thức chức năng hoặc bởi một khai báo chức năng kế thừa phạm vi hiện tại. Đó là, chức năng tạo thành một đóng cửa. Mặt khác, một hàm được xác định bởi hàm tạo
const myFunction = function [] {
statements
}
0 không kế thừa bất kỳ phạm vi nào ngoài phạm vi toàn cầu [tất cả các chức năng kế thừa].function [name][[param[, param[, ... param]]]] {
statements
}
0Các hàm được xác định bởi các biểu thức chức năng và khai báo hàm chỉ được phân tích cú pháp một lần, trong khi các hàm được xác định bởi hàm tạo
const myFunction = function [] {
statements
}
0 thì không. Đó là, chuỗi cơ thể chức năng được truyền đến hàm tạo const myFunction = function [] {
statements
}
0 phải được phân tích cú pháp mỗi khi hàm tạo được gọi. Mặc dù một biểu thức chức năng tạo ra đóng cửa mỗi lần, cơ thể chức năng không được sửa chữa, do đó các biểu thức chức năng vẫn nhanh hơn function name[[param[, param[, ... param]]]] {
statements
}
03. Do đó, hàm tạo const myFunction = function [] {
statements
}
0 thường nên tránh bất cứ khi nào có thể.Tuy nhiên, cần lưu ý rằng các biểu thức chức năng và khai báo hàm được lồng trong hàm được tạo bằng cách phân tích chuỗi của chuỗi xây dựng
new Function [arg1, arg2, ... argN, functionBody]
7 không được phân tích cú pháp nhiều lần. Ví dụ:function [name][[param[, param[, ... param]]]] {
statements
}
1Một tuyên bố chức năng rất dễ dàng [và thường vô tình] đã biến thành một biểu thức chức năng. Một tuyên bố chức năng không còn là một khi nó:
- trở thành một phần của một biểu thức
- không còn là "phần tử nguồn" của một hàm hoặc chính tập lệnh. "Phần tử nguồn" là một câu lệnh không được lồng trong tập lệnh hoặc cơ thể hàm:
function [name][[param[, param[, ... param]]]] {
statements
}
2Ví dụ
function [name][[param[, param[, ... param]]]] {
statements
}
3Các chức năng cấp khối
Trong chế độ nghiêm ngặt, bắt đầu bằng ES2015, các chức năng bên trong các khối hiện được phân chia đến khối đó. Trước ES2015, các chức năng cấp khối đã bị cấm ở chế độ nghiêm ngặt.
function [name][[param[, param[, ... param]]]] {
statements
}
4Các chức năng cấp khối trong mã không nghiêm ngặt
Trong một từ: Đừng.
Trong mã không nghiêm ngặt, khai báo chức năng bên trong các khối hoạt động kỳ lạ. Ví dụ:
function [name][[param[, param[, ... param]]]] {
statements
}
5ES2015 nói rằng nếu
function name[[param[, param[, ... param]]]] {
statements
}
06 là sai, thì function name[[param[, param[, ... param]]]] {
statements
}
07 không bao giờ được xác định, vì khối không bao giờ thực thi. Tuy nhiên, đó là một phần mới của tiêu chuẩn. Trong lịch sử, điều này đã không được xác định và một số trình duyệt sẽ xác định function name[[param[, param[, ... param]]]] {
statements
}
07 cho dù khối được thực thi hay không.Trong chế độ nghiêm ngặt, tất cả các trình duyệt hỗ trợ ES2015 xử lý theo cùng một cách:
function name[[param[, param[, ... param]]]] {
statements
}
07 chỉ được xác định nếu function name[[param[, param[, ... param]]]] {
statements
}
06 là đúng và chỉ tồn tại trong phạm vi đó của khối ________ 111.Một cách an toàn hơn để xác định các chức năng một cách có điều kiện là gán một biểu thức chức năng cho một biến:
function [name][[param[, param[, ... param]]]] {
statements
}
6Ví dụ
Các chức năng cấp khối
Trong chế độ nghiêm ngặt, bắt đầu bằng ES2015, các chức năng bên trong các khối hiện được phân chia đến khối đó. Trước ES2015, các chức năng cấp khối đã bị cấm ở chế độ nghiêm ngặt.
function [name][[param[, param[, ... param]]]] {
statements
}
7Các chức năng cấp khối trong mã không nghiêm ngặt
function [name][[param[, param[, ... param]]]] {
statements
}
8Trong một từ: Đừng.
Trong mã không nghiêm ngặt, khai báo chức năng bên trong các khối hoạt động kỳ lạ. Ví dụ:
function [name][[param[, param[, ... param]]]] {
statements
}
9ES2015 nói rằng nếu
function name[[param[, param[, ... param]]]] {
statements
}
06 là sai, thì function name[[param[, param[, ... param]]]] {
statements
}
07 không bao giờ được xác định, vì khối không bao giờ thực thi. Tuy nhiên, đó là một phần mới của tiêu chuẩn. Trong lịch sử, điều này đã không được xác định và một số trình duyệt sẽ xác định function name[[param[, param[, ... param]]]] {
statements
}
07 cho dù khối được thực thi hay không. Trong chế độ nghiêm ngặt, tất cả các trình duyệt hỗ trợ ES2015 xử lý theo cùng một cách: function name[[param[, param[, ... param]]]] {
statements
}
07 chỉ được xác định nếu function name[[param[, param[, ... param]]]] {
statements
}
06 là đúng và chỉ tồn tại trong phạm vi đó của khối ________ 111.
function name[[param[, param[, ... param]]]] {
statements
}
function name[[param[, param[, ... param]]]] {
statements
}
Trả về một số được định dạng # sec-function-definitions |
Hàm sau trả về một chuỗi chứa biểu diễn được định dạng của một số được đệm với các số không dẫn đầu.
Các câu sau đây gọi hàm Padzeros.