Tôi có thể thêm bao nhiêu tham số vào hàm JavaScript?

Là những lập trình viên chức năng, chúng tôi muốn ghép các chương trình của mình lại với nhau từ những phần nhỏ. Công cụ chính của chúng tôi cho việc này là thành phần. Chúng tôi lấy một đầu vào, xử lý nó thông qua một chức năng, sau đó chuyển nó sang một chức năng khác. Và điều này thật tuyệt, miễn là tất cả các hàm của chúng ta nhận đúng một đối số. Điều không bao giờ xảy ra. Vậy, chúng ta làm gì?

Bây giờ, tổ hợp là một chủ đề lớn và có thể trở nên khá trừu tượng và khó hiểu. Vì vậy, chúng tôi sẽ tập trung vào một vấn đề cụ thể xuất hiện nhiều. Và chúng tôi sẽ chỉ ra cách một tổ hợp đặc biệt giải quyết vấn đề đó cho chúng tôi

Một vấn đề mẫu

Vì vậy, vấn đề là gì? . Thông thường, cuối cùng chúng ta cần trích xuất hai bit dữ liệu, xử lý chúng, sau đó ghép chúng lại với nhau. Ví dụ, hãy tưởng tượng chúng ta có một đối tượng người

const person = {
    firstname: 'Horatio',
    lastname:  'Alderaan',
};

Và chúng tôi muốn lấy tên và họ ra khỏi đối tượng đó một cách riêng biệt. Sau đó, chúng tôi muốn kết hợp các kết quả trong một tin nhắn (vâng, vâng, đó là một ví dụ ngớ ngẩn; hãy thông cảm cho tôi). Dưới đây là các chức năng trích xuất của chúng tôi

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}

Chúng tôi muốn sử dụng cả hai tên đó trong một tin nhắn

function compliment(first, last) {
    return `Why hello, ${first} ${last}. You look most fetching today.`;
}

Nhưng tất nhiên, bởi vì chúng tôi là lập trình viên chức năng, chúng tôi luôn tìm hiểu các chức năng của mình

function compliment(first) {
    return last => `Why hello, ${first} ${last}. You look most fetching today.`;
}

Bây giờ viết ra điều này theo phong cách mệnh lệnh thật dễ dàng

const complimentPerson = person => compliment(firstname(person))(lastname(person));

Nhưng trong lập trình chức năng, chúng tôi muốn

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
2 chức năng của chúng tôi. Và bên cạnh đó, thật khó để viết
function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
3 hai lần. Hơn nữa, mô hình này xuất hiện mọi lúc. Chúng tôi muốn một cái gì đó sẽ nhận ba chức năng của chúng tôi và kết hợp chúng lại với nhau. Và, làm điều đó theo cách mà tất cả các đầu vào và đầu ra thẳng hàng. Một cái gì đó giống như sơ đồ dưới đây

Chúng tôi muốn một số loại chức năng sẽ kết nối tên (), họ () và lời khen () với nhau cho chúng tôi

Bạn sẽ nghĩ rằng sẽ có một tổ hợp tiêu chuẩn cho mẫu này… và hóa ra là có, nhưng rất khó tìm. Phải mất một số đào trước khi tôi tìm thấy một cái tên cho nó. Nó được gọi là thang máy. Vì vậy, làm thế nào nó hoạt động?

  1. Phải mất ba chức năng đầu vào. Cái đầu tiên nhận hai tham số (một hàm nhị phân). Hai cái còn lại chỉ lấy một tham số (hàm đơn nguyên)
  2. Nó trả về một hàm chấp nhận một tham số duy nhất. Nó chuyển tham số này cho cả hai hàm đơn nguyên. Sau đó, nó sử dụng hàm nhị phân để kết hợp hai kết quả

Nó dễ dàng hơn để giải thích trong mã

const lift2 = f => g => h => x => f(g(x))(h(x));

Chúng tôi gọi nó là

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
4 vì phiên bản này cho phép chúng tôi làm việc với các hàm nhị phân (nghĩa là các hàm nhận hai tham số). Chúng ta cũng có thể viết
function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
5 cho các hàm nhận ba tham số, v.v.

Bây giờ chúng ta đã tạo hàm

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
4, chúng ta có thể sử dụng nó như sau

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
1

Một ví dụ thực tế hơn

Bây giờ, đó là một ví dụ tầm thường. Chúng tôi không thực sự cần

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
4 để giải quyết vấn đề đó. Thay vào đó, chúng ta có thể viết một hàm mẫu đơn giản. Vì vậy, hãy thử một ví dụ khác (lấy cảm hứng từ nhận xét này). Chúng tôi sẽ thử thứ gì đó liên quan đến nội dung 'thế giới thực', chẳng hạn như DOM. Hãy tưởng tượng chúng ta có một đặc tả biểu mẫu trông giống như thế này

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
3

Chúng tôi muốn tạo một tập hợp các trường biểu mẫu HTML dựa trên thông số kỹ thuật này. Chúng tôi tạo một hàm cho nhãn biểu mẫu và một hàm khác cho đầu vào. (Chúng tôi sẽ bỏ qua tạp chất vào lúc này, vì chúng tôi đang tập trung vào bố cục)

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
4

Sẽ thật tuyệt nếu chúng tôi có thể ánh xạ thông số kỹ thuật của mình và tạo ra một loạt các

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
8. Với mỗi
function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
8 chứa một cặp nhãn-đầu vào. Chúng ta sẽ tạo một hàm tạo phần tử
function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
8 mới, sau đó nối thêm nhãn và đầu vào của chúng ta

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
8

Với

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
4, chúng ta có thể dán mọi thứ lại với nhau một cách độc đáo

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
0

Nó có vẻ không nhiều, nhưng tôi thấy mình luôn muốn một cái gì đó như thế này. Tuy nhiên, bạn có thể tự hỏi, điều gì sẽ xảy ra nếu chúng ta cần hội tụ ba chức năng? . Ramda bao gồm một chức năng gọi là

function compliment(first, last) {
    return `Why hello, ${first} ${last}. You look most fetching today.`;
}
2. Nó cho phép bạn chỉ định bao nhiêu hàm tùy thích trong một mảng. Vì vậy, bạn sẽ sử dụng nó như thế này

function firstname(p) {
    return p.firstname;
}

function lastname(p) {
    return p.lastname;
}
1

Vì vậy, tại sao không cho nó đi? . Và nếu bạn thấy nó hữu ích, vui lòng gửi cho tôi một tweet và cho tôi biết


Cập nhật ngày 5 tháng 10 năm 2019. Phiên bản cũ hơn của bài viết này có tên là lift the 'blackbird combinator'. Điều này đã sai. Bộ kết hợp blackbird trông tương tự nhưng làm điều gì đó khác biệt. Nó cho phép bạn soạn hàm một ngôi với hàm nhị phân. Nếu bạn muốn biết thêm về các trình kết hợp trong JavaScript, hãy xem bảng tính tuyệt vời này và các bài thuyết trình của Học viện Full Stack của Gabriel Lebec

Bạn có thể thêm bao nhiêu tham số vào một chức năng?

Không có không có giới hạn tối đa để truyền tham số hoặc đối số cho hàm do người dùng xác định. Nhưng đối với một chức năng được xác định trước, nó phụ thuộc vào. Không chắc chắn, tuy nhiên một số nguồn nói rằng hàm C chấp nhận ít nhất 127 tham số.

Một hàm có thể có nhiều tham số JavaScript không?

Hàm có thể chấp nhận nhiều đối số . Khi gọi một hàm, bạn có thể truyền nhiều đối số cho hàm; .

Số tham số tối đa mà một hàm có thể có là bao nhiêu?

1 câu trả lời. Giải thích. C++ cho phép số lượng tối đa 256 đối số trong một lệnh gọi hàm.

Hàm có thể có nhiều tham số không?

May mắn thay, bạn có thể viết các hàm nhận nhiều hơn một tham số bằng cách xác định bao nhiêu tham số tùy thích , chẳng hạn. def function_name(dữ liệu_1, dữ liệu_2).