Hướng dẫn why do we use apply in javascript? - tại sao chúng ta sử dụng apply trong javascript?

Phương thức apply() gọi hàm được chỉ định với giá trị this đã cho và arguments được cung cấp dưới dạng mảng (hoặc một đối tượng giống như mảng).apply() method calls the specified function with a given this value, and arguments provided as an array (or an array-like object).

Thử nó

Cú pháp

apply(thisArg) apply(thisArg, argsArray)

Thông số

function wrapper() { return anotherFn.apply(null, arguments); } 0

Giá trị của this được cung cấp cho cuộc gọi đến function wrapper() { return anotherFn.apply(null, arguments); } 2. Nếu hàm không ở chế độ nghiêm ngặt, function wrapper() { return anotherFn.apply(null, arguments); } 3 và function wrapper() { return anotherFn.apply(null, arguments); } 4 sẽ được thay thế bằng đối tượng toàn cầu và các giá trị nguyên thủy sẽ được chuyển đổi thành các đối tượng.

function wrapper() { return anotherFn.apply(null, arguments); } 5 Tùy chọnOptional

Một đối tượng giống như mảng, chỉ định các đối số mà function wrapper() { return anotherFn.apply(null, arguments); } 2 nên được gọi hoặc function wrapper() { return anotherFn.apply(null, arguments); } 3 hoặc function wrapper() { return anotherFn.apply(null, arguments); } 4 nếu không có đối số nào được cung cấp cho hàm.

Giá trị trả về

Kết quả của việc gọi hàm với giá trị và đối số this được chỉ định.

Sự mô tả

Lưu ý: Hàm này gần như giống hệt với function wrapper(...args) { return anotherFn(...args); } 0, ngoại trừ function wrapper(...args) { return anotherFn(...args); } 0 chấp nhận danh sách đối số, trong khi apply() chấp nhận một mảng đối số duy nhất - ví dụ: function wrapper(...args) { return anotherFn(...args); } 3 so với function wrapper(...args) { return anotherFn(...args); } 4. This function is almost identical to function wrapper(...args) { return anotherFn(...args); } 0, except that function wrapper(...args) { return anotherFn(...args); } 0 accepts an argument list, while apply() accepts a single array of arguments — for example, function wrapper(...args) { return anotherFn(...args); } 3 vs. function wrapper(...args) { return anotherFn(...args); } 4.

Bạn có thể gán một đối tượng this khác khi gọi một hàm hiện có. this đề cập đến đối tượng hiện tại (đối tượng gọi). Với function wrapper(...args) { return anotherFn(...args); } 7, bạn có thể viết một phương thức một lần và sau đó kế thừa nó trong một đối tượng khác mà không phải viết lại phương thức cho đối tượng mới.

Bạn cũng có thể sử dụng bất kỳ loại đối tượng nào giống như mảng làm tham số thứ hai. Trong thực tế, điều này có nghĩa là nó cần phải có thuộc tính function wrapper(...args) { return anotherFn(...args); } 8 và các thuộc tính số nguyên ("index") trong phạm vi function wrapper(...args) { return anotherFn(...args); } 9. Ví dụ: bạn có thể sử dụng const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 0 hoặc đối tượng tùy chỉnh như const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 1. Bạn cũng có thể sử dụng arguments, ví dụ:

function wrapper() { return anotherFn.apply(null, arguments); }

Với các tham số còn lại và cú pháp lan truyền tham số, điều này có thể được viết lại như:

function wrapper(...args) { return anotherFn(...args); }

Nói chung, const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 3 tương đương với const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 4 với cú pháp lan truyền tham số.

Ví dụ

Sử dụng áp dụng để nối một mảng cho người khác

Bạn có thể sử dụng const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 5 để nối một phần tử vào một mảng. Vì const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 6 chấp nhận một số lượng đối số thay đổi, bạn cũng có thể đẩy nhiều phần tử cùng một lúc. Nhưng nếu bạn chuyển một mảng đến const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 6, nó thực sự sẽ thêm mảng đó dưới dạng một phần tử, thay vì thêm các phần tử riêng lẻ, kết thúc bằng một mảng bên trong một mảng. Mặt khác, const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2] 8 có hành vi mong muốn trong trường hợp này, nhưng nó không nối vào mảng hiện tại mà nó tạo ra và trả về một mảng mới.

Trong trường hợp này, bạn có thể sử dụng function wrapper(...args) { return anotherFn(...args); } 7 để ngầm "lan truyền" một mảng như một loạt các đối số.

const array = ["a", "b"]; const elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // ["a", "b", 0, 1, 2]

Hiệu ứng tương tự có thể đạt được với cú pháp lan truyền.

const array = ["a", "b"]; const elements = [0, 1, 2]; array.push(...elements); console.info(array); // ["a", "b", 0, 1, 2]

Sử dụng các chức năng áp dụng và tích hợp

Việc sử dụng thông minh function wrapper(...args) { return anotherFn(...args); } 7 cho phép bạn sử dụng các hàm tích hợp cho một số tác vụ có thể được viết bằng cách lặp qua các giá trị mảng.

Ví dụ, ở đây là ____ 41/________ 42, được sử dụng để tìm ra giá trị tối đa/tối thiểu trong một mảng.

// min/max number in an array const numbers = [5, 6, 2, 3, 7]; // using Math.min/Math.max apply let max = Math.max.apply(null, numbers); // This about equal to Math.max(numbers[0], …) // or Math.max(5, 6, …) let min = Math.min.apply(null, numbers); // vs. simple loop based algorithm max = -Infinity; min = +Infinity; for (let i = 0; i < numbers.length; i++) { if (numbers[i] > max) { max = numbers[i]; } if (numbers[i] < min) { min = numbers[i]; } }

Nhưng hãy cẩn thận: Bằng cách sử dụng function wrapper(...args) { return anotherFn(...args); } 7 theo cách này, bạn có nguy cơ vượt quá giới hạn độ dài đối số của động cơ JavaScript. Hậu quả của việc áp dụng một chức năng có quá nhiều đối số (nghĩa là hơn hàng chục ngàn đối số) thay đổi trên các động cơ. (Động cơ JavaScriptCore có giới hạn đối số cứng là 65536.)

Điều này là do giới hạn (và thực sự, ngay cả bản chất của bất kỳ hành vi nào quá lớn) không được xác định. Một số động cơ sẽ ném một ngoại lệ. Một cách nghiêm túc hơn, những người khác sẽ tùy ý giới hạn số lượng đối số thực sự được truyền cho chức năng được áp dụng. Để minh họa trường hợp sau này: nếu một động cơ như vậy có giới hạn bốn đối số (tất nhiên giới hạn thực tế cao hơn đáng kể), thì sẽ như thể các đối số const array = ["a", "b"]; const elements = [0, 1, 2]; array.push(...elements); console.info(array); // ["a", "b", 0, 1, 2] 4 đã được chuyển đến function wrapper(...args) { return anotherFn(...args); } 7 trong các ví dụ trên, thay vì mảng đầy đủ.

Nếu mảng giá trị của bạn có thể phát triển thành hàng chục ngàn, hãy sử dụng chiến lược lai: Áp dụng chức năng của bạn vào các khối của mảng tại một thời điểm:

function minOfArray(arr) { let min = Infinity; const QUANTUM = 32768; for (let i = 0; i < arr.length; i += QUANTUM) { const submin = Math.min.apply( null, arr.slice(i, Math.min(i + QUANTUM, arr.length)) ); min = Math.min(submin, min); } return min; } const min = minOfArray([5, 6, 2, 3, 7]);

Thông số kỹ thuật

Sự chỉ rõ
Đặc tả ngôn ngữ Ecmascript # Sec-function.prototype.apply
# sec-function.prototype.apply

Tính tương thích của trình duyệt web

Bảng BCD chỉ tải trong trình duyệt

Xem thêm

Tại sao chúng ta sử dụng Áp dụng trong JS?

Bạn có thể gán một đối tượng này khác khi gọi một chức năng hiện có. Điều này đề cập đến đối tượng hiện tại (đối tượng gọi). Với Áp dụng, bạn có thể viết một phương thức một lần và sau đó kế thừa nó trong một đối tượng khác mà không phải viết lại phương thức cho đối tượng mới.you can write a method once, and then inherit it in another object, without having to rewrite the method for the new object.

Tại sao chúng ta sử dụng cuộc gọi và áp dụng trong JS?

Gọi gọi chức năng và cho phép bạn chuyển từng đối số một. Áp dụng chức năng và cho phép bạn truyền trong các đối số dưới dạng một mảng.Bind trả về một chức năng mới, cho phép bạn vượt qua trong một mảng này và bất kỳ số lượng đối số nào. Apply invokes the function and allows you to pass in arguments as an array. Bind returns a new function, allowing you to pass in a this array and any number of arguments.

Chức năng áp dụng là gì?

Táo là một loại trái cây cực kỳ bổ dưỡng mang lại nhiều lợi ích sức khỏe.Chúng giàu chất xơ và chất chống oxy hóa.Ăn chúng có liên quan đến nguy cơ thấp hơn của nhiều bệnh mãn tính, bao gồm bệnh tiểu đường, bệnh tim và ung thư.Táo cũng có thể thúc đẩy giảm cân và cải thiện sức khỏe ruột và não.promote weight loss and improve gut and brain health.

Tại sao chúng ta sử dụng Call áp dụng và ràng buộc?

Gọi: Liên kết giá trị này, gọi hàm và cho phép bạn vượt qua danh sách các đối số.Áp dụng: Liên kết giá trị này, gọi hàm và cho phép bạn chuyển các đối số dưới dạng một mảng.BIND: Liên kết giá trị này, trả về một hàm mới và cho phép bạn chuyển trong danh sách các đối số.

Chủ đề