Hướng dẫn what is closure in javascript - đóng trong javascript là gì


Các biến JavaScript có thể thuộc về phạm vi địa phương hoặc toàn cầu.local or global scope.

Các biến toàn cầu có thể được thực hiện tại địa phương (riêng tư) với việc đóng cửa.closures.


Biến toàn cầu

A function có thể truy cập tất cả các biến được xác định bên trong hàm, như thế này:inside the function, like this:

Nhưng function cũng có thể truy cập các biến được xác định bên ngoài hàm, như thế này:outside the function, like this:

Trong ví dụ cuối cùng, A là một biến toàn cầu.a is a global variable.

Trong một trang web, các biến toàn cầu thuộc về trang.

Các biến toàn cầu có thể được sử dụng (và thay đổi) bởi tất cả các tập lệnh khác trong trang.

Trong ví dụ đầu tiên, A là một biến cục bộ.a is a local variable.

Một 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ó được ẩn khỏi các chức năng khác và mã kịch bản khác.

Các biến toàn cầu và 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 khác.

Các biến được tạo mà không có từ khóa khai báo (var, let hoặc const) luôn luôn toàn cầu, ngay cả khi chúng được tạo bên trong một hàm.without a declaration keyword (var, let, or const) are always global, even if they are created inside a function.



Thời gian thay đổi

Các biến toàn cầu trực tiếp cho đến khi trang bị loại bỏ, như khi bạn điều hướng đến một trang khác hoặc đóng cửa sổ.

Các biến địa phương có cuộc sống ngắn ngủi. Chúng được tạo khi hàm được gọi và xóa khi hàm kết thúc.


Một vấn đề nan giải

Giả sử bạn muốn sử dụng một biến để đếm một cái 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 một biến toàn cầu và function để tăng bộ đếm:

Thí dụ

// bắt đầu bộ đếm đối diện = 0;
let counter = 0;

// Hàm để tăng cường đối phó add () {& nbsp; & nbsp; bộ đếm += 1; }
function add() {
  counter += 1;
}

// gọi thêm () 3 lần thêm (); cộng(); cộng();
add();
add();
add();

// quầy bây giờ sẽ là 3

Hãy 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 thêm ().

Bộ đếm phải là cục bộ cho chức năng add(), để ngăn mã khác thay đổi nó:

Thí dụ

// bắt đầu bộ đếm đối diện = 0;
let counter = 0;

// Hàm để tăng cường đối phó add () {& nbsp; & nbsp; bộ đếm += 1; }
function add() {
  let counter = 0;
  counter += 1;
}

// gọi thêm () 3 lần thêm (); cộng(); cộng();
add();
add();
add();

// quầy bây giờ sẽ là 3

Hãy 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 thêm ().

Bộ đếm phải là cục bộ cho chức năng add(), để ngăn mã khác thay đổi nó:

Thí dụ

// bắt đầu bộ đếm đối diện = 0;
function add() {
  let counter = 0;
  counter += 1;
  return counter;
}

// gọi thêm () 3 lần thêm (); cộng(); cộng();
add();
add();
add();

// quầy bây giờ sẽ là 3

Hãy 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 thêm ().

Bộ đếm phải là cục bộ cho chức năng add(), để ngăn mã khác thay đổi nó:A JavaScript inner function can solve this.


// Hàm để tăng đối trọng thêm () {& nbsp; Đặt bộ đếm = 0; & nbsp; Bộ đếm += 1;}

// gọi thêm () 3 timesadd (); add (); add ();

// Bộ đếm bây giờ sẽ là 3. nhưng đó là 0

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ể xóa bộ đếm toàn cầu và truy cập bộ đếm cục bộ bằng cách để chức năng trả về nó:

Thí dụ

// bắt đầu bộ đếm đối diện = 0;
  let counter = 0;
  function plus() {counter += 1;}
  plus();   
  return counter;
}

Hãy 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 thêm ().

Bộ đếm phải là cục bộ cho chức năng add(), để ngăn mã khác thay đổi nó:

// Hàm để tăng đối trọng thêm () {& nbsp; Đặt bộ đếm = 0; & nbsp; Bộ đếm += 1;}


// gọi thêm () 3 timesadd (); add (); add ();

// Bộ đếm bây giờ sẽ là 3. nhưng đó là 0

Thí dụ

// bắt đầu bộ đếm đối diện = 0;
  let counter = 0;
  return function () {counter += 1; return counter}
})();

// Hàm để tăng cường đối phó add () {& nbsp; & nbsp; bộ đếm += 1; }
add();
add();

// gọi thêm () 3 lần thêm (); cộng(); cộng();

Hãy 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 thêm ().

Bộ đếm phải là cục bộ cho chức năng add(), để ngăn mã khác thay đổi nó:

// Hàm để tăng đối trọng thêm () {& nbsp; Đặt bộ đếm = 0; & nbsp; Bộ đếm += 1;}

// gọi thêm () 3 timesadd (); add (); add ();

// Bộ đếm bây giờ sẽ là 3. nhưng đó là 0closure. It makes it possible for a function to have "private" variables.

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ể xóa bộ đếm toàn cầu và truy cập bộ đếm cục bộ bằng cách để chức năng trả về nó:


Đóng cửa là gì giải thích?

Đóng cửa là kết thúc hoặc đóng cửa của một cái gì đó. Nó có thể là vật lý - giống như việc đóng cửa thư viện địa phương của bạn - hoặc tình cảm, giống như sự đóng cửa mà bạn trải nghiệm khi cuối cùng bạn cũng đi đến kết thúc một mối tình lãng mạn. Đóng cửa đến từ Claus Latin ("Shut"), và nó có nhiều sắc thái ý nghĩa khác nhau.the end or the closing down of something. It can be physical — like the closure of your local library — or emotional, like the closure you experience when you finally come to terms with the end of a romance. Closure comes from the Latin claus ("shut"), and it has many different shades of meaning.

Đóng cửa trong JavaScript với ví dụ thời gian thực là gì?

Trong JavaScript, đóng cửa được định nghĩa là các hàm bên trong có quyền truy cập vào các biến và tham số của hàm bên ngoài ngay cả sau khi hàm bên ngoài đã trở lại.inner functions that have access to variables and parameters of outer function even after the outer function has returned.

Đóng cửa và lời hứa trong JavaScript là gì?

Đóng cửa và lời hứa là những khái niệm khác nhau.Việc đóng cửa đề cập đến phạm vi của các biến trong đó như lời hứa được sử dụng để 'hứa' rằng một hành động trên một cái gì đó sẽ xảy ra khi nó được thực hiện trên một hành động không đồng bộ.Closures refers to scope of variables where as promise are used to 'promise' that an act on something will occur when it is done on an asynchronous action.

Đóng cửa và loại là gì?

Các chức năng toàn cầu và lồng nhau, như được giới thiệu trong các chức năng, thực sự là những trường hợp đóng cửa đặc biệt.Việc đóng cửa một trong ba biểu mẫu: các chức năng toàn cầu là các đóng cửa có tên và không nắm bắt bất kỳ giá trị nào. Các hàm được kiểm tra là các đóng cửa có tên và có thể nắm bắt các giá trị từ hàm bao quanh của chúng.Global functions are closures that have a name and don't capture any values. Nested functions are closures that have a name and can capture values from their enclosing function.