Hướng dẫn function without parameters javascript - hàm không có tham số javascript

Bởi vì các chức năng là các thành viên hạng nhất trong JavaScript - chúng có thể được tham chiếu như bất kỳ biểu thức nào. Ví dụ: có thể bạn muốn lưu trữ nó trong một biến khác:

function foo[] { console.log['foo']; }

const anotherReferenceToFoo = foo;
anotherReferenceToFoo[];

Hoặc có thể bạn muốn vượt qua chức năng, mà không gọi nó, chẳng hạn như

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
1:

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
click

Hoặc đến

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
2:

function foo[] { console.log['foo']; }
setTimeout[foo, 1000];

Tham khảo một tên chức năng mà không gọi nó là một kỹ thuật rất hữu ích. Không có nó, nhiều thứ sẽ là không thể.

Nếu bạn chỉ có dòng

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
3, không có gì khác trên đó, thì đây không phải là lỗi vì lý do tương tự mà biểu thức không sử dụng không phải là lỗi:

'5';

true;

[] => 'foo';

console.log['syntax is fine'];

Nếu bạn muốn đảm bảo rằng bạn không mắc các loại sai lầm này, hãy xem xét việc cài đặt ESLINT và thực thi quy tắc không có biểu hiện không sử dụng.

  • " Trước
  • Tiếp theo "

Các chức năng là một trong những khối xây dựng cơ bản trong JavaScript. Một hàm trong JavaScript tương tự như một thủ tục, một tập hợp các câu lệnh thực hiện một tác vụ hoặc tính toán một giá trị, nhưng đối với một quy trình để đủ điều kiện làm chức năng, nó sẽ lấy một số đầu vào và trả về một đầu ra trong đó có một số mối quan hệ rõ ràng giữa đầu vào và đầu ra. Để sử dụng một hàm, bạn phải xác định nó ở đâu đó trong phạm vi mà bạn muốn gọi nó.

Xem thêm Chương tham chiếu toàn diện về các chức năng JavaScript để tìm hiểu các chi tiết.

Xác định chức năng

Tuyên bố chức năng

Một định nghĩa chức năng [còn được gọi là khai báo chức năng hoặc câu lệnh hàm] bao gồm từ khóa

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
4, theo sau là:function definition [also called a function declaration, or function statement] consists of the
'5';

true;

[] => 'foo';

console.log['syntax is fine'];
4 keyword, followed by:

  • Tên của hàm.
  • Một danh sách các tham số cho hàm, được đặt trong dấu ngoặc đơn và được phân tách bằng dấu phẩy.
  • Các câu lệnh JavaScript xác định hàm, được đặt trong các dấu ngoặc xoăn,
    '5';
    
    true;
    
    [] => 'foo';
    
    console.log['syntax is fine'];
    5.

Ví dụ: mã sau xác định một hàm đơn giản có tên

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
6:

function square[number] {
  return number * number;
}

Hàm

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
6 có một tham số, được gọi là
'5';

true;

[] => 'foo';

console.log['syntax is fine'];
8. Hàm bao gồm một câu lệnh cho biết trả về tham số của hàm [nghĩa là
'5';

true;

[] => 'foo';

console.log['syntax is fine'];
8] nhân với chính nó. Câu lệnh
function square[number] {
  return number * number;
}
0 chỉ định giá trị được trả về bởi hàm:

Các tham số về cơ bản được truyền đến các hàm theo giá trị - vì vậy nếu mã trong phần thân của hàm gán một giá trị hoàn toàn mới cho một tham số được truyền cho hàm, sự thay đổi không được phản ánh trên toàn cầu hoặc trong mã được gọi là hàm đó.by value — so if the code within the body of a function assigns a completely new value to a parameter that was passed to the function, the change is not reflected globally or in the code which called that function.

Khi bạn chuyển một đối tượng dưới dạng tham số, nếu hàm thay đổi thuộc tính của đối tượng, thay đổi đó có thể hiển thị bên ngoài hàm, như trong ví dụ sau:

function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;

Khi bạn chuyển một mảng làm tham số, nếu hàm thay đổi bất kỳ giá trị nào của mảng, thay đổi đó có thể hiển thị bên ngoài hàm, như trong ví dụ sau:

function myFunc[theArr] {
  theArr[0] = 30;
}

const arr = [45];

console.log[arr[0]]; // 45
myFunc[arr];
console.log[arr[0]]; // 30

Biểu thức chức năng

Trong khi khai báo hàm ở trên là một câu lệnh, các hàm cũng có thể được tạo bằng một biểu thức chức năng.

Một chức năng như vậy có thể ẩn danh; Nó không phải có một cái tên. Ví dụ: hàm

'5';

true;

[] => 'foo';

console.log['syntax is fine'];
6 có thể được định nghĩa là:anonymous; it does not have to have a name. For example, the function
'5';

true;

[] => 'foo';

console.log['syntax is fine'];
6 could have been defined as:

const square = function [number] {
  return number * number;
}
const x = square[4]; // x gets the value 16

Tuy nhiên, một tên có thể được cung cấp với một biểu thức chức năng. Cung cấp tên cho phép chức năng đề cập đến chính nó và cũng giúp dễ dàng xác định chức năng trong dấu vết ngăn xếp của trình gỡ lỗi:

const factorial = function fac[n] {
  return n  'foo';

console.log['syntax is fine'];
6, bạn có thể gọi nó như sau: the function actually performs the specified actions with the indicated parameters. For example, if you define the function
'5';

true;

[] => 'foo';

console.log['syntax is fine'];
6, you could call it as follows:

Câu lệnh trước gọi hàm với đối số là

function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
0. Hàm thực thi các câu lệnh của nó và trả về giá trị
function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
1.

Các chức năng phải nằm trong phạm vi khi chúng được gọi, nhưng khai báo chức năng có thể được nâng lên [xuất hiện bên dưới cuộc gọi trong mã]. Phạm vi của một khai báo hàm là hàm trong đó được khai báo [hoặc toàn bộ chương trình, nếu nó được khai báo ở cấp cao nhất].

Các đối số của một hàm không giới hạn ở các chuỗi và số. Bạn có thể chuyển toàn bộ đối tượng cho một chức năng. Hàm

function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
2 [được xác định trong làm việc với các đối tượng] là một ví dụ về hàm lấy một đối tượng làm đối số.

Một chức năng có thể gọi chính nó. Ví dụ, đây là một chức năng tính toán các giai thừa một cách đệ quy:

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
3

Sau đó, bạn có thể tính toán các giai thừa của

function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
3 đến
function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
0 như sau:

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
4

Có nhiều cách khác để gọi các chức năng. Thường có các trường hợp một hàm cần được gọi là động hoặc số lượng đối số cho một hàm khác nhau hoặc trong đó bối cảnh của lệnh gọi hàm cần được đặt thành một đối tượng cụ thể được xác định trong thời gian chạy.

Nó chỉ ra rằng các chức năng là các đối tượng của chúng - và đến lượt nó, các đối tượng này có các phương thức. [Xem đối tượng

function square[number] {
  return number * number;
}
7.] Các phương pháp
function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
6 và
function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
7 có thể được sử dụng để đạt được mục tiêu này.

Chức năng nâng cao

Xem xét ví dụ dưới đây:

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
5

Mã này chạy mà không có bất kỳ lỗi nào, mặc dù chức năng

function myFunc[theObject] {
  theObject.make = 'Toyota';
}

const mycar = {
  make: 'Honda',
  model: 'Accord',
  year: 1998,
};

// x gets the value "Honda"
const x = mycar.make;

// the make property is changed by the function
myFunc[mycar];
// y gets the value "Toyota"
const y = mycar.make;
8 được gọi trước khi được khai báo. Điều này là do trình thông dịch JavaScript nâng toàn bộ khai báo chức năng lên đầu phạm vi hiện tại, do đó mã trên tương đương với:

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
6

Chức năng nâng chỉ hoạt động với các khai báo chức năng - không phải với các biểu thức chức năng. Mã dưới đây sẽ không hoạt động.

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
7

Phạm vi chức năng

Các biến được xác định bên trong một hàm không thể được truy cập từ bất cứ nơi nào bên ngoài hàm, bởi vì biến chỉ được xác định trong phạm vi của hàm. Tuy nhiên, một hàm có thể truy cập tất cả các biến và hàm được xác định bên trong phạm vi mà nó được xác định.

Nói cách khác, một hàm được xác định trong phạm vi toàn cầu có thể truy cập tất cả các biến được xác định trong phạm vi toàn cầu. Một hàm được xác định bên trong một hàm khác cũng có thể truy cập tất cả các biến được xác định trong hàm cha của nó và bất kỳ biến nào khác mà hàm cha có quyền truy cập.

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
8

Phạm vi và ngăn xếp chức năng

Đệ quy

Một chức năng có thể tham khảo và gọi chính nó. Có ba cách để một chức năng đề cập đến chính nó:

  1. Tên của chức năng
  2. function myFunc[theObject] {
      theObject.make = 'Toyota';
    }
    
    const mycar = {
      make: 'Honda',
      model: 'Accord',
      year: 1998,
    };
    
    // x gets the value "Honda"
    const x = mycar.make;
    
    // the make property is changed by the function
    myFunc[mycar];
    // y gets the value "Toyota"
    const y = mycar.make;
    
    9
  3. Một biến trong phạm vi đề cập đến chức năng

Ví dụ, hãy xem xét định nghĩa chức năng sau:

function foo[] { console.log['foo']; }
button.addEventListener['click', foo];
9

Trong cơ thể chức năng, sau đây đều tương đương:

  1. function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    0
  2. function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    1
  3. function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    2

Một hàm tự gọi được gọi là hàm đệ quy. Trong một số cách, đệ quy tương tự như một vòng lặp. Cả hai thực thi cùng một mã nhiều lần và cả hai đều yêu cầu một điều kiện [để tránh một vòng lặp vô hạn, hoặc đúng hơn là đệ quy vô hạn trong trường hợp này].

Ví dụ, hãy xem xét vòng lặp sau:

click
0

Nó có thể được chuyển đổi thành khai báo chức năng đệ quy, theo sau là một cuộc gọi đến chức năng đó:

click
1

Tuy nhiên, một số thuật toán không thể là các vòng lặp đơn giản. Ví dụ: nhận tất cả các nút của cấu trúc cây [như DOM] dễ dàng hơn thông qua đệ quy:

click
2

So với hàm

function myFunc[theArr] {
  theArr[0] = 30;
}

const arr = [45];

console.log[arr[0]]; // 45
myFunc[arr];
console.log[arr[0]]; // 30
3, mỗi cuộc gọi đệ quy thực hiện nhiều cuộc gọi đệ quy ở đây.

Có thể chuyển đổi bất kỳ thuật toán đệ quy nào thành một thuật toán không nhận được, nhưng logic thường phức tạp hơn nhiều và làm như vậy đòi hỏi phải sử dụng ngăn xếp.

Trong thực tế, việc đệ quy sử dụng một ngăn xếp: Chức năng ngăn xếp. Hành vi giống như ngăn xếp có thể được nhìn thấy trong ví dụ sau:

click
3

Các chức năng và đóng cửa lồng nhau

Bạn có thể làm tổ một chức năng trong một chức năng khác. Hàm lồng nhau [bên trong] là riêng tư cho hàm [bên ngoài] của nó.

Nó cũng tạo thành một đóng cửa. Đóng cửa là một biểu thức [phổ biến nhất là một hàm] có thể có các biến tự do cùng với một môi trường liên kết các biến đó ["đóng" biểu thức].

Vì một hàm lồng nhau là một đóng cửa, điều này có nghĩa là một hàm lồng nhau có thể "kế thừa" các đối số và biến của hàm chứa của nó. Nói cách khác, hàm bên trong chứa phạm vi của hàm bên ngoài.

Để tóm tắt:

  • Hàm bên trong chỉ có thể được truy cập từ các câu lệnh trong hàm bên ngoài.
  • Hàm bên trong tạo thành một đóng: hàm bên trong có thể sử dụng các đối số và biến của hàm bên ngoài, trong khi hàm bên ngoài không thể sử dụng các đối số và biến của hàm bên trong.

Ví dụ sau đây cho thấy các chức năng lồng nhau:

click
4

Vì hàm bên trong hình thành việc đóng, bạn có thể gọi hàm bên ngoài và chỉ định các đối số cho cả hàm bên ngoài và bên trong:

click
5

Bảo tồn các biến

Lưu ý cách

function myFunc[theArr] {
  theArr[0] = 30;
}

const arr = [45];

console.log[arr[0]]; // 45
myFunc[arr];
console.log[arr[0]]; // 30
4 được bảo tồn khi
function myFunc[theArr] {
  theArr[0] = 30;
}

const arr = [45];

console.log[arr[0]]; // 45
myFunc[arr];
console.log[arr[0]]; // 30
5 được trả lại. Một đóng cửa phải lưu giữ các đối số và biến trong tất cả các phạm vi tham chiếu. Vì mỗi cuộc gọi cung cấp các đối số có khả năng khác nhau, nên việc đóng cửa mới được tạo cho mỗi cuộc gọi đến
function myFunc[theArr] {
  theArr[0] = 30;
}

const arr = [45];

console.log[arr[0]]; // 45
myFunc[arr];
console.log[arr[0]]; // 30
6. Bộ nhớ chỉ có thể được giải phóng khi
function myFunc[theArr] {
  theArr[0] = 30;
}

const arr = [45];

console.log[arr[0]]; // 45
myFunc[arr];
console.log[arr[0]]; // 30
5 trả về không còn có thể truy cập được.

Điều này không khác với việc lưu trữ các tài liệu tham khảo trong các đối tượng khác, nhưng thường ít rõ ràng hơn vì người ta không đặt các tài liệu tham khảo trực tiếp và không thể kiểm tra chúng.

Nhân các chức năng được lồng

Các chức năng có thể được nhân lên. Ví dụ:

  • Một hàm [
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    8] chứa hàm [
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    9], bản thân chứa hàm [
    const square = function [number] {
      return number * number;
    }
    const x = square[4]; // x gets the value 16
    
    0].
  • Cả hai chức năng
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    9 và
    const square = function [number] {
      return number * number;
    }
    const x = square[4]; // x gets the value 16
    
    0 đóng cửa biểu mẫu ở đây. Vì vậy,
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    9 có thể truy cập
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    8 và
    const square = function [number] {
      return number * number;
    }
    const x = square[4]; // x gets the value 16
    
    0 có thể truy cập
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    9.
  • Ngoài ra, vì
    const square = function [number] {
      return number * number;
    }
    const x = square[4]; // x gets the value 16
    
    0 có thể truy cập
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    9 có thể truy cập
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    8,
    const square = function [number] {
      return number * number;
    }
    const x = square[4]; // x gets the value 16
    
    0 cũng có thể truy cập
    function myFunc[theArr] {
      theArr[0] = 30;
    }
    
    const arr = [45];
    
    console.log[arr[0]]; // 45
    myFunc[arr];
    console.log[arr[0]]; // 30
    
    8.

Do đó, việc đóng cửa có thể chứa nhiều phạm vi; Chúng đệ quy chứa phạm vi của các chức năng chứa nó. Đây được gọi là chuỗi phạm vi. [Lý do nó được gọi là "chuỗi" được giải thích sau.]

Xem xét ví dụ sau:

click
6

Trong ví dụ này,

const square = function [number] {
  return number * number;
}
const x = square[4]; // x gets the value 16
0 truy cập ________ 79's
const factorial = function fac[n] {
  return n 

Bài Viết Liên Quan

Chủ Đề