Javascript gán chức năng cho biến

Bạn có thể gán các hàm cho các biến [vì trong JS bạn có thể chuyển các hàm như thể chúng là dữ liệu thuần túy], như trong

function bar[] {}
09. Bạn cũng có thể gọi hàm trong
function bar[] {}
10 bằng cách viết
function bar[] {}
11 vào mã của mình

Ngoài ra, các biến trong JS không có kiểu. Một biến trước đây chứa một số không quan tâm nếu bạn gán cho nó một chuỗi hoặc mảng hoặc một hàm

Khi bạn thay đổi nó thành

function bar[] {}
12, bạn đang gọi hàm
function bar[] {}
13, hàm này trả về
function bar[] {}
14 [đơn giản vì không có câu lệnh trả về nào trong hàm đó]. Vì vậy,
function bar[] {}
15 bây giờ là
function bar[] {}
14, đây chắc chắn không phải là một hàm và bạn gặp lỗi khi thực thi
function bar[] {}
17

hoặc chúng ta có thể viết nó có một trình xử lý [gọi lại] trong trình xử lý sự kiện, [giả sử chúng ta có một phần tử nút với id=”click-me”],

document.getElementById['click-me'].addEventListener['click',function [] {}];

Chúng tôi gọi nó là một biểu thức vì nó không phải là một câu lệnh và nó cần một ngữ cảnh hoặc một nhiệm vụ

Hàm được khai báo hơi khác một chút ở chỗ nó là một câu lệnh hoàn chỉnh ngay lập tức

function bar[] {}

Dạng hàm này là bất biến, nghĩa là không thể thay đổi.

function bar[] {}
18 khắc cốt ghi tâm, không thể giao nhiệm vụ mới.
function bar[] {}
19 ở trên có thể được giao nhiệm vụ mới bất cứ lúc nào

Để tìm hiểu thêm về điều này, hãy tìm kiếm, 'khai báo hàm so với biểu thức hàm' và để ý đến thuật ngữ, 'hoisting' để bạn biết cách nó phù hợp với bức tranh này

Qua một bên.

function bar[] {}
20 là từ dành riêng trong JavaScript và chúng tôi không thể sử dụng nó trong ngữ cảnh cửa sổ chung, chỉ bên trong một hàm hoặc dưới dạng thuộc tính đối tượng. Tìm kiếm
function bar[] {}
21 và bạn có thể tìm thấy điều gì đó về điều này

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

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

________số 8

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 bar[] {}
4

function bar[] {}
5Chạ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 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

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

Đâ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 làm đố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 thực tế với 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 bar[] {}
40 và
function bar[] {}
41, được truyền dưới dạng tham số cho hàm
function bar[] {}
42. Tất nhiên, chỉ một tham chiếu đến chức năng được thông qua. Hàm
function bar[] {}
40 và
function bar[] {}
41 đượ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 bar[] {}
42 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 bar[] {}
46 thực thi tốt trước khi hoạt ảnh
function bar[] {}
47 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ó chuyể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 bar[] {}
48 chấp nhận hai đối số cho tên và họ.
function bar[] {}
49 và
function bar[] {}
50. 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 bar[] {}
49, thì một hàm khác được trả về với bao đóng chứa giá trị
function bar[] {}
49. 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 bar[] {}
50 vì nó đã biết giá trị
function bar[] {}
49 là gì. Một lần nữa, nó thực hiện công việc tương tự như
function bar[] {}
48, nhưng giá trị của
function bar[] {}
49 đượ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 bar[] {}
57 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 bar[] {}
58 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 bar[] {}
59 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
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
21, giống như
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
22. Đối số bạn chuyển đến
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
23 được chuyển thành đối số
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
24 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 bar[] {}
57 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 bar[] {}
57 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à

function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
28. Giá trị
function bar[] {}
58 bị ràng buộc là null, i. e. đối tượng toàn cầu và các đối số
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
30 và
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
31 được ràng buộc lần lượt là 1 và 2. Gọi
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
28 với giá trị đối số 3 liên kết giá trị này với
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
30 rồi thực thi hàm
function bar[] {}
40 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

function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
35 thực hiện tính toán chuyển đổi đơn vị thực tế. Nhìn vào
function bar[] {}
57 và, một lần nữa, đối số null đề cập đến đối tượng chung được sử dụng là
function bar[] {}
58. Ba đối số tiếp theo được liên kết với
function message[] {
    console.log["Greetings Linda!"];
}

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
38,
function message[] {
    console.log["Greetings Linda!"];
}

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

console.log[typeof message];               // => function
console.log[message instanceof Object];    // => true
35 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 nề 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ể gán một hàm cho một biến JavaScript không?

Người lập trình có thể tạo một biến duy nhất bằng cách sử dụng các từ khóa var, let hoặc const và gán biểu thức hàm cho biến đó . Tuy nhiên, nên tạo một biến với từ khóa const để gán hàm vì biểu thức hàm luôn không đổi.

Tôi có thể gán chức năng cho một biến không?

Trong Python, chúng ta có thể gán một hàm cho một biến . Và sử dụng biến đó, chúng ta có thể gọi hàm bao nhiêu lần chúng ta muốn. Qua đó, tăng khả năng tái sử dụng code. Chỉ cần gán một hàm cho biến mong muốn nhưng không có [] i. e. chỉ với tên của chức năng.

Điều gì xảy ra khi bạn gán một hàm cho một biến trong JavaScript?

Khi bạn gán một đối tượng hàm cho một biến khác, JavaScript không tạo 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.

Chủ Đề