Một chức năng có thể có một chức năng trong javascript?

Biến cục bộ chỉ có thể được sử dụng bên trong hàm nơi nó được xác định. Nó bị ẩn khỏi các chức năng khác và mã kịch bản khác

Biến toàn cục và biến cục bộ có cùng tên là các biến khác nhau. Sửa đổi cái này, không sửa đổi cái kia

Ghi chú

Các biến được tạo mà không có từ khóa khai báo (_______0, let hoặc const) luôn là biến toàn cục, ngay cả khi chúng được tạo bên trong một hàm



Thời gian thay đổi

Các biến toàn cầu tồn tại cho đến khi trang bị hủy, chẳng hạn như khi bạn điều hướng đến một trang khác hoặc đóng cửa sổ

Biến cục bộ có thời gian sống ngắn. Chúng được tạo khi hàm được gọi và bị xóa khi hàm kết thúc


Một vấn đề tiến thoái lưỡng nan

Giả sử bạn muốn sử dụng một biến để đếm thứ gì đó và bạn muốn bộ đếm này có sẵn cho tất cả các chức năng

Bạn có thể sử dụng biến toàn cục và function để tăng bộ đếm

Thí dụ

// Khởi tạo bộ đếm
let counter = 0;

// Hàm tăng bộ đếm
hàm add() {
  bộ đếm += 1;
}<

// Gọi add() 3 lần
add();
add();
add(

// Bộ đếm bây giờ là 3

Tự mình thử »

Có một vấn đề với giải pháp trên. Bất kỳ mã nào trên trang đều có thể thay đổi bộ đếm mà không cần gọi hàm add()

Bộ đếm phải là cục bộ của hàm add(), để ngăn mã khác thay đổi nó

Thí dụ

// Khởi tạo bộ đếm
let counter = 0;

// Hàm tăng bộ đếm
hàm add() {
  let counter = 0;
  counter +
}

// Gọi add() 3 lần
add();
add();
add(

// Bộ đếm bây giờ là 3. Nhưng nó là 0

Tự mình thử »

Nó không hoạt động vì chúng tôi hiển thị bộ đếm toàn cầu thay vì bộ đếm cục bộ

Chúng ta có thể loại bỏ bộ đếm toàn cục và truy cập bộ đếm cục bộ bằng cách để hàm trả về nó

Thí dụ

// Hàm tăng bộ đếm
hàm add() {
  let counter = 0;
  counter +
  return counter;
}

// Gọi add() 3 lần
add();
add();
add(

// Bộ đếm bây giờ là 3. Nhưng nó là 1

Tự mình thử »

Nó không hoạt động vì chúng tôi đặt lại bộ đếm cục bộ mỗi khi chúng tôi gọi hàm

Hàm bên trong JavaScript có thể giải quyết vấn đề này


Các hàm lồng nhau trong JavaScript

Tất cả các chức năng có quyền truy cập vào phạm vi toàn cầu.   

Trên thực tế, trong JavaScript, tất cả các hàm đều có quyền truy cập vào phạm vi "ở trên" chúng

JavaScript hỗ trợ các hàm lồng nhau. Các hàm lồng nhau có quyền truy cập vào phạm vi "ở trên" chúng

Trong ví dụ này, hàm bên trong plus() có quyền truy cập vào biến counter trong hàm cha

Thí dụ

function add() {
  let counter = 0;
  function plus() {counter += 1;}
  plus();
  return counter;
}

Tự mình thử »

Điều này có thể đã giải quyết được vấn đề nan giải, nếu chúng ta có thể tiếp cận hàm plus() từ bên ngoài

Chúng tôi cũng cần tìm cách thực hiện function0 chỉ một lần

Chúng ta cần đóng cửa


Đóng JavaScript

Nhớ chức năng tự gọi?

Thí dụ

const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter}<
})();

add();
add();
add();

// bộ đếm bây giờ là 3

Tự mình thử »

Ví dụ giải thích

Biến function1 được gán cho giá trị trả về của hàm tự gọi

Chức năng tự gọi chỉ chạy một lần. Nó đặt bộ đếm thành không (0) và trả về một biểu thức hàm

Bằng cách này, add trở thành một chức năng. Phần "tuyệt vời" là nó có thể truy cập bộ đếm trong phạm vi cha

Điều này được gọi là đóng JavaScript. Nó giúp một hàm có thể có các biến "riêng tư"

Bộ đếm được bảo vệ bởi phạm vi của chức năng ẩn danh và chỉ có thể thay đổi bằng chức năng thêm

Bao đóng là một hàm có quyền truy cập vào phạm vi cha, ngay cả sau khi hàm cha đã đóng

Các chức năng được khai báo không được thực thi ngay lập tức. Chúng được "lưu để sử dụng sau" và sẽ được thực thi sau, khi chúng được gọi (được gọi)

Dấu chấm phẩy được sử dụng để phân tách các câu lệnh JavaScript thực thi.
Vì một khai báo hàm không phải là một câu lệnh thực thi nên không thường kết thúc nó bằng dấu chấm phẩy.


Biểu thức hàm

Hàm JavaScript cũng có thể được xác định bằng biểu thức

Một biểu thức chức năng có thể được lưu trữ trong một biến

Sau khi một biểu thức hàm đã được lưu trữ trong một biến, biến đó có thể được sử dụng như một hàm

Chức năng trên thực sự là một chức năng ẩn danh (một chức năng không có tên)

Các hàm được lưu trữ trong các biến không cần tên hàm. Chúng luôn được gọi (được gọi) bằng cách sử dụng tên biến

Hàm trên kết thúc bằng dấu chấm phẩy vì nó là một phần của câu lệnh thực thi



Hàm xây dựng ()

Như bạn đã thấy trong các ví dụ trước, các hàm JavaScript được định nghĩa bằng từ khóa function

Các hàm cũng có thể được xác định bằng hàm tạo hàm JavaScript tích hợp có tên là let1

Thí dụ

const myFunction = new Function("a", "b", "return a * b");

cho x = myFunction(4, 3);

Tự mình thử »

Bạn thực sự không phải sử dụng hàm tạo. Ví dụ trên cũng giống như cách viết

Thí dụ

const myFunction = function(a,b) {return a*b};

cho x = myFunction(4, 3);

Tự mình thử »

Hầu hết thời gian, bạn có thể tránh sử dụng từ khóa let2 trong JavaScript


cẩu chức năng

Trước đó trong hướng dẫn này, bạn đã học về "hoisting" (JavaScript Hoisting)

Nâng là hành vi mặc định của JavaScript để di chuyển các khai báo lên đầu phạm vi hiện tại

Hoisting áp dụng cho khai báo biến và khai báo hàm

Do đó, các hàm JavaScript có thể được gọi trước khi chúng được khai báo

chức năng của tôi (5);

function myFunction(y) {
  return y * y;
}

Các chức năng được xác định bằng một biểu thức không được nâng lên


Chức năng tự gọi

Các biểu thức chức năng có thể được thực hiện "tự gọi"

Một biểu thức tự gọi được gọi (bắt đầu) tự động mà không được gọi

Các biểu thức hàm sẽ tự động thực thi nếu biểu thức được theo sau bởi ()

Bạn không thể tự gọi khai báo hàm

Bạn phải thêm dấu ngoặc đơn xung quanh hàm để chỉ ra rằng đó là một biểu thức hàm

Thí dụ

(function () {
  let x = "Xin chào. ";  // Tôi sẽ gọi chính mình
})();

Tự mình thử »

Chức năng trên thực sự là một chức năng tự gọi ẩn danh (hàm không có tên)


Hàm có thể được sử dụng làm giá trị

Các hàm JavaScript có thể được sử dụng làm giá trị

Thí dụ

function myFunction(a, b) {
  return a * b;
}

cho x = myFunction(4, 3);

Tự mình thử »

Các hàm JavaScript có thể được sử dụng trong các biểu thức

Thí dụ

function myFunction(a, b) {
  return a * b;
}

đặt x = myFunction(4, 3) * 2;

Tự mình thử »


Chức năng là đối tượng

Toán tử let3 trong JavaScript trả về "hàm" cho các hàm

Tuy nhiên, các hàm JavaScript tốt nhất có thể được mô tả dưới dạng các đối tượng

Hàm JavaScript có cả thuộc tính và phương thức

Thuộc tính let4 trả về số đối số nhận được khi hàm được gọi

Phương thức let5 trả về hàm dưới dạng một chuỗi

Thí dụ

function myFunction(a, b) {
  return a * b;
}

hãy để văn bản = myFunction. toString();

Tự mình thử »

Một hàm được định nghĩa là thuộc tính của một đối tượng, được gọi là một phương thức đối với đối tượng.
Một hàm được thiết kế để tạo đối tượng mới, được gọi là hàm tạo đối tượng.


Hàm mũi tên

Các hàm mũi tên cho phép một cú pháp ngắn để viết các biểu thức hàm

Bạn không cần từ khóa function, từ khóa let7 và dấu ngoặc nhọn

Thí dụ

// ES5
var x = function(x, y) {
  return x * y;
}

// ES6
const x = (x, y) => x * y;

Tự mình thử »

Các hàm mũi tên không có let8 của riêng chúng. Chúng không phù hợp để xác định các phương thức đối tượng

Các chức năng mũi tên không được nâng lên. Chúng phải được xác định trước khi chúng được sử dụng

Sử dụng function0 an toàn hơn sử dụng function1, vì biểu thức hàm luôn có giá trị không đổi

Bạn chỉ có thể bỏ qua từ khóa let7 và dấu ngoặc nhọn nếu hàm là một câu lệnh đơn. Vì điều này, có thể là một thói quen tốt để luôn giữ chúng

Bạn có thể đặt một chức năng trong một chức năng?

Hàm lồng nhau là một hàm được chứa hoàn toàn trong hàm cha. Bất kỳ chức năng nào trong tệp chương trình đều có thể bao gồm chức năng lồng nhau . Sự khác biệt chính giữa các hàm lồng nhau và các loại hàm khác là chúng có thể truy cập và sửa đổi các biến được xác định trong hàm cha của chúng.

Hàm có thể trả về hàm trong JavaScript không?

Hàm có cùng dữ liệu dưới dạng số hoặc chuỗi, vì vậy hàm có thể được truyền cho các hàm khác dưới dạng đối số, cũng như được trả về từ hàm . Thậm chí chúng ta có thể định nghĩa một hàm bên trong một hàm khác và đưa nó ra bên ngoài.

3 loại chức năng trong JavaScript là gì?

Có 3 cách viết hàm trong JavaScript. Khai báo hàm . Biểu thức hàm . Hàm mũi tên .