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

Bạn có thể chuyển đối tượng sang chức năng javascript không?


Chức năng là đối tượng hạng nhất

Như đã đề 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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
Chạy

Chú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..

var body = "return Math.PI * radius * radius";
var circle = new Function("radius", body);

console.log(circle(5));          // => 78.5398..
Chạy

Bạ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

var body = "return Math.PI * radius * radius";
var circle = new Function("radius", body);

console.log(circle(5));          // => 78.5398..
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
var body = "return Math.PI * radius * radius";
var circle = new Function("radius", body);

console.log(circle(5));          // => 78.5398..
9

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 King

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 King
Chạy

Hàm tạo

var body = "return Math.PI * radius * radius";
var circle = new Function("radius", body);

console.log(circle(5));          // => 78.5398..
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 King
1. 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 King
2 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 King
3 là một đối tượng chức năng

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
2

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
3Chạy

Tiế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 King
4 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 King
4 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 King
6 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 King
4 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 King
8. 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 King
8 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 King
4. 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 King
4 dưới dạng đối số

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
0

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
1Chạy

Ghi chú. phương thức

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 King
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ếu

Khi 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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
2

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
3Chạy

Ví 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,

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 King
4 và
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 King
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ếu


Chú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

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 King
4 được thay đổi và JavaScript sẽ tạo một đối tượng hàm mới

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
4

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
5Chạy

Gán thân hàm mới 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 King
4 sẽ tạo một đối tượng hàm mới. Lưu ý rằng 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 King
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ại

Giố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 King
4)

Trong ví dụ tiếp theo, hai hàm khác nhau,

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
20 và
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
21, được truyền dưới dạng tham số cho hàm
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
22. Tất nhiên, chỉ một tham chiếu đến chức năng được thông qua. Hàm
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
20 và
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
22 sẽ gọi lại (i. e. gọi nó) với hai giá trị đối số được cung cấp

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
6

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
7Chạy

Cá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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
26 thực thi tốt trước khi hoạt hình
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
27 hoàn tất, đây có thể không phải là điều bạn muốn

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
9Chạy  Đặt lại

Vì 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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
28 chấp nhận hai đối số cho tên và họ.
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
29 và
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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ố

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
29, thì một hàm khác được trả về với bao đóng chứa giá trị
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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à
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
30 vì nó đã biết giá trị
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
29 là gì. Một lần nữa, nó thực hiện công việc tương tự như
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
28, nhưng giá trị của
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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à

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
38 của hàm

var 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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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 King
3 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 King
3

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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
37 cũng bị ràng buộc

var 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ị
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
20 mà không cần viết hàm curry

Tiế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ị

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

Hà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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
37 và, một lần nữa, đối số null đề cập đến đối tượng chung được sử dụng là
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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à
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
01 và
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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
function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
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

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 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

function message() {
    console.log("Greetings Linda!");
}

console.log(typeof message);               // => function
console.log(message instanceof Object);    // => true
06 được gọi đệ quy 177 lần để tạo tổng của 10 số Fibonacci đầu tiên

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

Chươ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

var 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

Để 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 .