Bạn có thể chuyển đối tượng sang chức năng javascript không?
Trong JavaScript, các hàm được gọi là Đối tượng hàm vì chúng là các đối tượng. Cũng giống như các đối tượng, các hàm có các thuộc tính và phương thức, chúng có thể được lưu trữ trong một biến hoặc một mảng và được truyền dưới dạng đối số cho các hàm khác Show
Chức năng là đối tượng hạng nhấtNhư đã đề cập, chức năng là đối tượng. Bạn có thể làm việc với các hàm như thể chúng là các đối tượng. Ví dụ: bạn có thể gán hàm cho biến, cho phần tử mảng và cho các đối tượng khác. Chúng cũng có thể được truyền xung quanh dưới dạng đối số cho các hàm khác hoặc được trả về từ các hàm đó. Sự khác biệt duy nhất với các đối tượng là các chức năng có thể được gọi Hãy chạy một bài kiểm tra nhỏ và xác nhận rằng một hàm thực sự là một thể hiện của đối tượng function message() { console.log("Greetings Linda!"); } console.log(typeof message); // => function console.log(message instanceof Object); // => true ChạyChúng ta thấy rằng một chức năng thực sự là một đối tượng. Hàm JavaScript là một loại đối tượng đặc biệt, được gọi là đối tượng hàm. Một đối tượng hàm bao gồm một chuỗi chứa mã thực -- thân hàm -- của hàm. Mã theo nghĩa đen chỉ là một chuỗi. Mặc dù không được khuyến nghị nhưng bạn có thể tạo một đối tượng hàm mới bằng cách chuyển hàm tạo Hàm tích hợp sẵn một chuỗi mã, như vậy var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398.. ChạyBạn cũng có thể tạo một hàm mới bằng hàm tạo tùy chỉnh (hãy nhớ rằng theo quy ước, hàm tạo luôn bắt đầu bằng một chữ cái viết hoa). Trong đoạn mã dưới đây, chúng ta có một hàm xây dựng 8 được sử dụng để tạo các thể hiện sách. Trong hàm tạo, chúng ta đang gán một đối tượng hàm cho thuộc tính 9function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King ChạyHàm tạo 8 chấp nhận một đối số được gán cho một thuộc tính có tên là function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King1. Khi một đối tượng được tạo, bạn có thể gán các giá trị thuộc tính và gọi các phương thức giống như bất kỳ đối tượng nào khác Các đối tượng chức năng cũng có thể được tạo như một phần của đối tượng theo nghĩa đen. Dưới đây, chúng tôi tạo một đối tượng có tên là function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King2 với một thuộc tính có tên là function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King3 là một đối tượng chức năng 2 3ChạyTiếp theo, hãy xem một ví dụ trong đó một đối tượng hàm được truyền xung quanh giống như một đối tượng thông thường. Hàm function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4 lấy một hàm làm đối số của nó. Một hàm mới được trả về từ lệnh gọi function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4 gọi hàm được truyền vào và trả về phủ định logic của giá trị trả về của nó Sau khi khai báo hàm, chúng tôi chuyển hàm function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King6 tích hợp cho function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4 và gán hàm được trả về biến function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King8. Biến function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King8 là một đối tượng hàm có thể được truyền xung quanh giống như bất kỳ đối tượng nào. Để gọi hàm, bạn gọi nó với các tham số khác nhau var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..0 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..1Chạy Đây là một ví dụ khác sử dụng cùng chức năng function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4. Chúng tôi đã thêm chức năng tùy chỉnh để kiểm tra xem một số có phải là số nguyên tố hay không (các số không phải là số nguyên tố được gọi là hợp số). Hàm này được truyền cho hàm function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4 dưới dạng đối số 0 1ChạyGhi chú. phương thức 2 tích hợp kiểm tra xem tất cả các phần tử trong mảng có vượt qua bài kiểm tra được thực hiện bởi hàm được truyền dưới dạng đối số hay không; Hàm được sao chép theo tham chiếuKhi bạn gán một đối tượng hàm cho một biến khác, JavaScript không tạo một bản sao mới của hàm. Thay vào đó, nó làm cho biến mới tham chiếu cùng một đối tượng hàm như ban đầu. Chỉ là hai biến có tên khác nhau đang truy cập cùng một đối tượng hàm cơ bản 2 3ChạyVí dụ này cho thấy rằng nếu chúng ta thêm một thuộc tính vào đối tượng hàm, thì cả hai biến, 4 và 5, sẽ bị thay đổi vì chúng đang tham chiếu đến cùng một đối tượng hàm. Điều này xác nhận rằng các đối tượng hàm thực sự được sao chép theo tham chiếuChúng ta vừa biết rằng các đối tượng hàm được sao chép theo tham chiếu. Tuy nhiên, khi sửa đổi thân hàm thực tế, mọi thứ hơi khác một chút vì điều này sẽ khiến một đối tượng hàm mới được tạo. Trong ví dụ tiếp theo, thân hàm 4 được thay đổi và JavaScript sẽ tạo một đối tượng hàm mới 4 5ChạyGán thân hàm mới cho 4 sẽ tạo một đối tượng hàm mới. Lưu ý rằng biến 5 vẫn tham chiếu đối tượng hàm cũTruyền một chức năng dưới dạng Gọi lạiGiống như một đối tượng thông thường, bạn có thể truyền một đối tượng hàm cho một hàm khác (thực ra bạn đã thấy điều này trong ví dụ về hàm function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King4) Trong ví dụ tiếp theo, hai hàm khác nhau, 20 và 21, được truyền dưới dạng tham số cho hàm 22. Tất nhiên, chỉ một tham chiếu đến chức năng được thông qua. Hàm 20 và 21 được gọi là hàm gọi lại hoặc hàm gọi lại phù hợp hơn. Hàm 22 sẽ gọi lại (i. e. gọi nó) với hai giá trị đối số được cung cấp 6 7ChạyCác hàm gọi lại đóng một vai trò quan trọng trong nhiều khung, bao gồm cả JQuery. Hãy xem xét mã dưới đây. Thông báo 26 thực thi tốt trước khi hoạt hình 27 hoàn tất, đây có thể không phải là điều bạn muốn 8Chạy Đặt lạiĐiều này có thể được giải quyết bằng cách chuyển vào hàm gọi lại sẽ chỉ thực thi khi hoạt ảnh hoàn tất 9Chạy Đặt lạiVì vậy, thay vì đợi một chức năng hoàn thành, bạn có thể sử dụng các lệnh gọi lại để thực thi nó một cách không đồng bộ. Điều này có lợi cho các tác vụ cần một khoảng thời gian để hoàn thành, chẳng hạn như hoạt ảnh ẩn ở trên. Một ví dụ khác là khi thực hiện thao tác AJAX và bạn không muốn người dùng đợi cuộc gọi quay lại. Điều này cho phép trình duyệt tiếp tục phản hồi các yêu cầu của người dùng trong khi chờ chức năng gọi lại được gọi Lập trình bất đồng bộ là một kỹ năng quan trọng cần có khi làm việc với JavaScript. Để tìm hiểu thêm về các cuộc gọi lại và vòng lặp sự kiện quan trọng, chúng tôi khuyên bạn nên kiểm tra JS Dofactory độc đáo của chúng tôi, nơi chúng tôi khám phá những chủ đề này và các chủ đề khác chi tiết hơn nhiều. Bấm vào đây để biết thêm chi tiết Trong trường hợp một hàm được gọi nhiều lần với hầu hết các đối số giống nhau, bạn có thể có một ứng cử viên cho currying. Để xử lý một hàm về cơ bản là lưu vào bộ đệm và sử dụng lại các giá trị đối số Một hàm được xử lý sử dụng một bao đóng để lưu trữ trạng thái của các đối số định kỳ để bạn không cần phải chuyển chúng mỗi lần. Sau đó, hàm mới sử dụng chúng để điền trước toàn bộ danh sách các đối số mà hàm ban đầu yêu cầu Đầu vào của quá trình cà ri là một hàm chấp nhận hai hoặc nhiều đối số. Sau đó, nó biến đổi hàm để tạo ra một hàm mới cung cấp chức năng tương tự nhưng với các đối số một phần (ít hơn so với ban đầu). Nó liên kết phần còn lại của các đối số với các giá trị cố định Hãy xem một ví dụ. Hàm 28 chấp nhận hai đối số cho tên và họ. 29 và 30. Nó nối chúng để tạo ra tên của người đóvar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..0 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..1Chạy Tiếp theo, chúng tôi tạo một phiên bản cà ri của chức năng tương tự. Nếu chúng ta truyền hai đối số thì nó thực thi bình thường, giống như ví dụ trên. Tuy nhiên, nếu chúng ta chỉ truyền đối số 29, thì một hàm khác được trả về với bao đóng chứa giá trị 29. Hàm được trả về chấp nhận một phần danh sách các đối số, trong ví dụ của chúng tôi, chỉ một đối số là 30 vì nó đã biết giá trị 29 là gì. Một lần nữa, nó thực hiện công việc tương tự như 28, nhưng giá trị của 29 được ghi nhớ trong phần đóng kết hợp với hàm trợ giúp ẩn danh được trả vềvar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..2 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..3Chạy Trong JavaScript, một chức năng cần một chức năng trợ giúp để đạt được currying. Chức năng trợ giúp này thường được gọi là chức năng cà ri Có một triển khai chung của currying có thể được áp dụng cho bất kỳ chức năng nào và mã bên dưới thể hiện điều này. Nó tạo một bao đóng lưu trữ cả hàm ban đầu và các đối số cho curry. Sau đó, khi được gọi lại, nó sẽ nối các đối số đến với mảng đối số trước đó và thực thi chức năng ban đầu. Một mảng giữ các đối số được truyền cho lời gọi hiện tại và mảng còn lại giữ các đối số được truyền cho hàm curry. Mảng nối sau đó được chuyển đến hàm ban đầu var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..4 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..5Chạy Tất cả các hàm JavaScript đều có một phương thức gọi là 37 liên kết với một đối tượng và trả về một hàm mới. Đối số đầu tiên để liên kết đặt ngữ cảnh 38 của hàmvar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..6 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..7Chạy Gọi 39 gọi hàm ban đầu function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King3 như một phương thức của var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..01, giống như var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..02. Đối số bạn chuyển đến var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..03 được chuyển thành đối số var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..04 cho hàm function Book(type, author) { this.type = type; this.author = author; this.getDetails = function () { return this.type + " written by " + this.author; } } var book = new Book("Fiction", "Peter King"); console.log(book.getDetails()); // => Fiction written by Peter King3 Ngoài việc liên kết một hàm với một đối tượng, EcmaScript 5 còn hỗ trợ một phương thức 37 mang lại tính năng tự nhiên cho JavaScript. Bạn không còn cần phải sử dụng chức năng trợ giúp cà ri. Số lượng đối số tùy ý mà bạn chuyển đến 37 cũng bị ràng buộcvar body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..8 var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..9Chạy Điều này tạo ra một chức năng mới gọi là var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..08. Giá trị 38 bị ràng buộc là null, i. e. đối tượng toàn cầu và các đối số var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..10 và var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..11 được ràng buộc lần lượt là 1 và 2. Gọi var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..08 với giá trị đối số 3 liên kết giá trị này với var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..10 rồi thực thi hàm 20 mà không cần viết hàm curryTiếp theo, chúng ta hãy xem xét một ứng dụng thực tế của cà ri trong lĩnh vực chuyển đổi đơn vị 0 1ChạyHàm var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..15 thực hiện tính toán chuyển đổi đơn vị thực tế. Nhìn vào 37 và, một lần nữa, đối số null đề cập đến đối tượng chung được sử dụng là 38. Ba đối số tiếp theo được liên kết với var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..18, var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..19 và 00 tương ứng. Các ràng buộc này được lưu trữ và duy trì trong bao đóng được liên kết với các đối tượng hàm 01 và 02. Trong hai dòng cuối cùng, chúng ta gọi mỗi hàm với một giá trị mà sau đó được liên kết với biến 03 và hàm var body = "return Math.PI * radius * radius"; var circle = new Function("radius", body); console.log(circle(5)); // => 78.5398..15 ban đầu được gọi trả về kết quả mong muốn Giả sử bạn đang xây dựng trò chơi đua ô tô bằng JavaScript và bạn cần theo dõi tổng số đối tượng ô tô đã được khởi tạo. Trong Java, bạn sẽ sử dụng từ khóa tĩnh cho việc này, nhưng JavaScript không cung cấp chức năng vượt trội như vậy Tất nhiên, bạn có thể chỉ cần lưu trữ phần dữ liệu này trong một biến toàn cục nhưng điều này sẽ thêm các biến không cần thiết vào không gian tên toàn cầu. Một giải pháp tốt hơn là lưu trữ thông tin này trong thuộc tính của đối tượng hàm. Hãy gọi hàm 05 và sử dụng nó để ghi nhớ giá trị tiếp theo sẽ được trả về. Sau đó, hàm sẽ có thể trả về một giá trị khác mỗi khi nó được gọi 2 3ChạyTrong lập trình chức năng, lưu trữ kết quả của lệnh gọi hàm được gọi là ghi nhớ. Hãy khám phá điều này chi tiết hơn một chút Ghi nhớ là một kỹ thuật tối ưu hóa được sử dụng để cải thiện hiệu suất của một hàm bằng cách lưu vào bộ nhớ đệm các giá trị trả về của hàm đó để không cần phải thực hiện lại các tính toán nặng tiềm ẩn trong lần gọi tiếp theo. Không phải tất cả các chức năng đều có thể được ghi nhớ; . Hàm minh bạch tham chiếu là hàm luôn tạo ra cùng một đầu ra trên một đầu vào nhất định. Chẳng hạn, nếu bạn gọi một hàm có giá trị x được truyền cho nó, thì nó sẽ thực hiện các phép tính trên x và luôn trả về cùng một giá trị y được liên kết Các ví dụ điển hình về lợi ích của việc ghi nhớ là hoạt ảnh HTML5 Canvas và các phép tính toán học đệ quy, chẳng hạn như tính toán giai thừa, tạo chuỗi Fibonacci và phép nhân chuỗi ma trận Hãy xem cách ghi nhớ có thể được sử dụng để cải thiện việc tính toán các số Fibonacci. Cách tiếp cận đệ quy để tạo ra những con số này không mở rộng rất tốt. Trong ví dụ bên dưới, hàm 06 được gọi đệ quy 177 lần để tạo tổng của 10 số Fibonacci đầu tiên 4 5ChạyChương trình thực hiện nhiều công việc bổ sung bằng cách không theo dõi các giá trị đã tính toán trước đó. Đây là nơi ghi nhớ đến. Đầu tiên, hãy khai báo một mảng bộ đệm nơi bạn có thể lưu trữ các giá trị hàm đã được tính toán đã được trả về trong các lần gọi trước. Sau đó, thay vì gọi hàm, hãy trả lại các giá trị này trong các lần gọi hàm tiếp theo, như vậy 6 7ChạyĐể tạo 10 số Fibonacci đầu tiên, hàm này chỉ được thực hiện đệ quy 20 lần. Một cải tiến đáng kể Tôi có thể chuyển đối tượng trong hàm không?Để chuyển một đối tượng làm đối số, chúng ta viết tên đối tượng làm đối số trong khi gọi hàm giống như cách chúng ta thực hiện đối với các biến khác . cú pháp. tên_hàm(tên_đối_tượng); . Trong ví dụ này, có một lớp có biến số nguyên 'a' và hàm 'add' lấy một đối tượng làm đối số.
Làm cách nào để gọi một đối tượng bên trong hàm JavaScript?Bạn có thể gọi một hàm bên trong một đối tượng bằng cách khai báo hàm đó như một thuộc tính trên đối tượng và gọi nó , e. g. đối tượng. tổng(2, 2). Thuộc tính của một đối tượng có thể trỏ đến một hàm, giống như nó có thể trỏ đến một chuỗi, số hoặc các giá trị khác. Đã sao chép.
Làm cách nào để chuyển đối tượng bằng JavaScript tham chiếu?JavaScript không chuyển qua tham chiếu . Tuy nhiên, JavaScript không tạo bản sao của các đối tượng khi chúng được truyền hoặc gán. Như vậy, đó là cùng một đối tượng có tên khác - những thay đổi được thực hiện đối với đối tượng (từ bất kỳ tên nào) ảnh hưởng đến đối tượng đã nói. Nó phụ thuộc vào những gì bạn có nghĩa là "vượt qua tham chiếu".
Một đối tượng có thể được gửi làm đối số cho một phương thức không?Do đó, khi chúng ta truyền tham chiếu này cho một phương thức, tham số nhận nó sẽ tham chiếu đến cùng một đối tượng như đối tượng được tham chiếu bởi đối số. Điều này thực sự có nghĩa là các đối tượng hoạt động như thể chúng được truyền cho các phương thức bằng cách gọi theo tham chiếu . |