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 var f = function[] {...};
. Bạn cũng có thể gọi hàm trong f
bằng cách viết f[]
trong 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 fn = baz[]
, bạn đang gọi hàm baz
, hàm này trả về undefined
[đơn giản vì không có câu lệnh trả về nào trong hàm đó]. Vì vậy, fn
bây giờ là undefined
, đâ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 fn[]
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. bar
được khắc ghi trong ký ức và không thể được giao nhiệm vụ mới. foo
ở 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. name
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 name window context
và bạn có thể tìm thấy điều gì đó về điều này
Một chức năng được định nghĩa như thế này có thể truy cập được từ bất kỳ đâu trong ngữ cảnh của nó bằng tên của nó. Nhưng đôi khi có thể hữu ích khi xử lý các tham chiếu hàm như tham chiếu đối tượng. Ví dụ: bạn có thể gán một đối tượng cho một biến dựa trên một số tập hợp điều kiện và sau đó truy xuất một thuộc tính từ một hoặc đối tượng khác
var name = 'Cameron';
var spouse;
if [ name === 'Taylor' ] spouse = { name: 'Jordan' };
else if [ name === 'Cameron' ] spouse = { name: 'Casey' };
var spouseName = spouse.name;
Trong JavaScript, bạn có thể làm điều tương tự với các hàm
// Example 1
var hashAlgorithm = 'sha1';
var hash;
if [ hashAlgorithm === 'sha1' ] hash = function[value]{ /*...*/ };
else if [ hashAlgorithm === 'md5' ] hash = function[value]{ /*...*/ };
hash['Fred'];
Trong ví dụ trên, hash
là một biến bình thường. Nó được gán một tham chiếu đến một hàm, sau đó hàm mà nó tham chiếu có thể được gọi bằng cách sử dụng dấu ngoặc đơn, giống như một khai báo hàm bình thường
Ví dụ trên tham khảo các chức năng ẩn danh. các hàm không có tên riêng. Bạn cũng có thể sử dụng các biến để chỉ các hàm được đặt tên. Ví dụ trên có thể được viết lại như vậy
// Example 2
var hashAlgorithm = 'sha1';
var hash;
if [ hashAlgorithm === 'sha1' ] hash = sha1Hash;
else if [ hashAlgorithm === 'md5' ] hash = md5Hash;
hash['Fred'];
function md5Hash[value]{
// ...
}
function sha1Hash[value]{
// ...
}
Hoặc, bạn có thể gán tham chiếu hàm từ thuộc tính đối tượng
// Example 3
var hashAlgorithms = {
sha1: function[value] { /**/ },
md5: function[value] { /**/ }
};
var hashAlgorithm = 'sha1';
var hash;
if [ hashAlgorithm === 'sha1' ] hash = hashAlgorithms.sha1;
else if [ hashAlgorithm === 'md5' ] hash = hashAlgorithms.md5;
hash['Fred'];
Bạn có thể gán tham chiếu cho một hàm do biến này nắm giữ cho biến khác bằng cách bỏ qua dấu ngoặc đơn. Điều này có thể dẫn đến một sai lầm dễ mắc phải. cố gắng gán giá trị trả về của một hàm cho một biến khác, nhưng vô tình gán tham chiếu cho hàm
// Example 4
var a = getValue;
var b = a; // b is now a reference to getValue.
var c = b[]; // b is invoked, so c now holds the value returned by getValue [41]
function getValue[]{
return 41;
}
Một tham chiếu đến một hàm giống như bất kỳ giá trị nào khác. Như bạn đã thấy, một tham chiếu có thể được gán cho một biến và giá trị tham chiếu của biến đó sau đó có thể được gán cho các biến khác. Bạn có thể chuyển tham chiếu đến hàm giống như bất kỳ giá trị nào khác, bao gồm chuyển tham chiếu đến hàm dưới dạng giá trị trả về của hàm khác. Ví dụ
// Example 5
// getHashingFunction returns a function, which is assigned
// to hash for later use:
var hash = getHashingFunction[ 'sha1' ];
// ...
hash['Fred'];
// return the function corresponding to the given algorithmName
function getHashingFunction[ algorithmName ]{
// return a reference to an anonymous function
if [algorithmName === 'sha1'] return function[value]{ /**/ };
// return a reference to a declared function
else if [algorithmName === 'md5'] return md5;
}
function md5Hash[value]{
// ...
}
Bạn không cần gán một tham chiếu hàm cho một biến để gọi nó. Ví dụ này, xây dựng từ ví dụ 5, sẽ gọi getHashingFunction và sau đó ngay lập tức gọi hàm được trả về và chuyển giá trị trả về của nó cho hashValue
________số 8_______Lưu ý khi cẩu hàng
Hãy nhớ rằng, không giống như khai báo hàm thông thường, các biến tham chiếu đến hàm không được "hoisted". Trong ví dụ 2, các hàm
var name = 'Cameron';
var spouse;
if [ name === 'Taylor' ] spouse = { name: 'Jordan' };
else if [ name === 'Cameron' ] spouse = { name: 'Casey' };
var spouseName = spouse.name;
0 và var name = 'Cameron';
var spouse;
if [ name === 'Taylor' ] spouse = { name: 'Jordan' };
else if [ name === 'Cameron' ] spouse = { name: 'Casey' };
var spouseName = spouse.name;
1 được xác định ở cuối tập lệnh, nhưng có sẵn ở mọi nơi ngay lập tức. Bất kể bạn định nghĩa một hàm ở đâu, trình thông dịch sẽ "nâng" nó lên đầu phạm vi của nó, làm cho nó khả dụng ngay lập tức. Đây không phải là trường hợp đối với các định nghĩa biến, vì vậy mã như sau sẽ bị hỏng