Sự đóng cửa trong JavaScript được giải thích với các ví dụ – javascript đóng cửa là gì

Closures là gì? Bao đóng là sự kết hợp của một hàm và môi trường từ vựng (phạm vi) mà trong đó hàm đó được khai báo. Closures là một thuộc tính cơ bản và mạnh mẽ của Javascript. Bài viết này thảo luận về ‘cách làm’ và ‘lý do’ về Closures: Ví dụ // chúng ta có một hàm bên ngoài có tên là walk và một

Bạn đang xem: đóng javascript là gì

< h1 id = "what-are-shutures"> Closures là gì?

Một bao đóng là sự kết hợp của một hàm và môi trường từ vựng (phạm vi) trong đó hàm đó được khai báo . Closures là một thuộc tính cơ bản và mạnh mẽ của Javascript. Bài viết này thảo luận về ‘cách làm’ và ‘lý do’ về Đóng cửa:

Ví dụ

  // chúng ta có một hàm bên ngoài có tên là walk và một hàm bên trong có tên là fly

function walk () {
  
  var dist = '1780 bộ';
  
  hàm fly () {
    console.log ('At' + dist);
  }
  
  bay trở về;
}

var flyFunc = walk (); // gọi walk trả về hàm fly đang được gán cho flyFunc
// bạn sẽ mong đợi rằng khi hàm walk ở trên được chạy
// bạn sẽ nghĩ rằng JavaScript đã loại bỏ var 'dist'

flyFunc (); // Đăng xuất 'Ở độ cao 1780 feet'
// nhưng bạn vẫn có thể sử dụng hàm như trên
// đây là sức mạnh của các bao đóng  

Một ví dụ khác

  chức năng của (propName) {
    hàm trả về (a, b) {
        return a [propName] - b [propName];
    }
}

const person1 = {name: 'joe', height: 72};
const person2 = {name: 'rob', height: 70};
const person3 = {name: 'nicholas', height: 66};

const arr_ = [person1, person2, person3];

const arr_sorted = arr_.sort (theo ('chiều cao')); // [{name: 'nicholas', height: 66}, {name: 'rob', height: 70}, {name: 'joe', height: 72}]  

Việc đóng lại ‘ghi nhớ’ môi trường mà nó được tạo ra. Môi trường này bao gồm bất kỳ biến cục bộ nào nằm trong phạm vi tại thời điểm đóng cửa được tạo.

  function bên ngoài (num) {
  var RememberVar = num; // Trong ví dụ này, RememberVar là môi trường từ vựng mà bao đóng 'nhớ'
  return function inside () {// Đây là hàm mà bao đóng 'ghi nhớ'
    console.log (RememberVar)
  }
}

var nhớ1 = bên ngoài (7); // memory1 bây giờ là một bao đóng có chứa RememberVar = 7 trong môi trường từ vựng của nó và // hàm 'bên trong'
var nhớ2 = bên ngoài (9); // memory2 bây giờ là một bao đóng có chứa RememberVar = 9 trong môi trường từ vựng của nó và // hàm 'bên trong'

nhớ1 (); // Điều này bây giờ thực thi hàm 'bên trong' mà console.logs (RememberVar) = & gt; 7
nhớ2 (); // Điều này bây giờ thực thi hàm 'bên trong' mà console.logs (RememberVar) = & gt; 9  

Đóng cửa rất hữu ích vì chúng cho phép bạn ‘ghi nhớ’ dữ liệu và sau đó cho phép bạn thao tác trên dữ liệu đó thông qua các hàm trả về. Điều này cho phép javascript mô phỏng các phương thức riêng được tìm thấy trong các ngôn ngữ lập trình khác. Các phương thức riêng tư hữu ích để hạn chế quyền truy cập vào mã cũng như quản lý không gian tên chung của bạn.

Các biến và phương thức riêng

Các phương thức và phương thức đóng cũng có thể được sử dụng để đóng gói dữ liệu / phương thức riêng tư. Hãy xem ví dụ sau:

  const bankAccount = (initialBalance) = & gt; {
  const balance = ban đầuBalance;

  trở về {
    getBalance: function () {
      trả lại số dư;
    },
    tiền gửi: hàm (số tiền) {
      số dư + = số tiền;
      trả lại số dư;
    },
  };
};

const account = bankAccount (100);

account.getBalance (); // 100
account.deposit (10); // 110  

Trong ví dụ này, chúng tôi sẽ không thể truy cập số dư từ bất kỳ đâu bên ngoài hàm bankAccount , hàm này nghĩa là chúng tôi vừa tạo một biến riêng. Đóng cửa ở đâu? Vâng, hãy nghĩ về những gì bankAccount () đang trả về. Nó thực sự trả về một Đối tượng với một loạt các hàm bên trong nó, nhưng khi chúng ta gọi account.getBalance () , hàm có thể “nhớ” tham chiếu ban đầu của nó tới balance . Đó là sức mạnh của hàm đóng, trong đó một hàm "nhớ" phạm vi từ vựng của nó (phạm vi thời gian biên dịch), ngay cả khi hàm được thực thi bên ngoài phạm vi từ vựng đó.

Mô phỏng các biến phạm vi khối.

Javascript không có khái niệm về các biến phạm vi khối. Có nghĩa là khi xác định một biến bên trong forloop chẳng hạn, biến này cũng có thể nhìn thấy từ bên ngoài forloop. Vì vậy, làm thế nào để đóng cửa có thể giúp chúng ta giải quyết vấn đề này? Hãy cùng xem.

 var funcs = [];
    
    for (var i = 0; i & lt; 3; i ++) {
        funcs [i] = function () {
            console.log ('Giá trị của tôi là' + i); // tạo ba hàm khác nhau với các giá trị tham số khác nhau.
        }
    }
    
    for (var j = 0; j & lt; 3; j ++) {
        funcs [j] (); // Giá trị của tôi là 3
                                // Giá trị của tôi là 3
                                // Giá trị của tôi là 3
    }  

Vì biến i không có phạm vi khối, nên giá trị của nó trong cả ba hàm đã được cập nhật với bộ đếm vòng lặp và tạo ra các giá trị độc hại. Đóng cửa có thể giúp chúng tôi giải quyết vấn đề này bằng cách tạo ảnh chụp nhanh về môi trường mà hàm đã ở trong khi nó được tạo, duy trì trạng thái của nó.

  var funcs = [];
    
    var createFunction = function (val) {
return function () {console.log ("Giá trị của tôi:" + val);};
    }

    for (var i = 0; i & lt; 3; i ++) {
        funcs [i] = createFunction (i);
    }
    for (var j = 0; j & lt; 3; j ++) {
        funcs [j] (); // Giá trị của tôi là 0
                                    // Giá trị của tôi là 1
                                    // Giá trị của tôi là 2
    }  

Các phiên bản cuối của javascript es6 + có một từ khóa mới được gọi là let có thể được sử dụng để cung cấp cho biến một khối hiển thị. Ngoài ra còn có nhiều hàm (forEach) và toàn bộ thư viện (lodash.js) được dành riêng để giải quyết các vấn đề như đã giải thích ở trên. Chúng chắc chắn có thể tăng năng suất của bạn, tuy nhiên, điều cực kỳ quan trọng là phải có kiến ​​thức về tất cả những vấn đề này khi cố gắng tạo ra một thứ gì đó lớn.

Closures có nhiều ứng dụng đặc biệt hữu ích khi tạo các chương trình javascript lớn.

  1. Mô phỏng các biến riêng tư hoặc đóng gói
  2. Thực hiện lệnh gọi phía máy chủ không đồng bộ
  3. Tạo biến phạm vi khối.

Mô phỏng các biến riêng tư.

Không giống như nhiều ngôn ngữ khác, Javascript không có cơ chế cho phép bạn tạo các biến phiên bản được đóng gói trong một đối tượng. Việc có các biến cá thể công khai có thể gây ra rất nhiều vấn đề khi xây dựng các chương trình từ trung bình đến lớn. Tuy nhiên, với các hàm đóng, vấn đề này có thể được giảm thiểu.

Giống như trong ví dụ trước, bạn có thể xây dựng các hàm trả về các ký tự đối tượng bằng các phương thức có quyền truy cập vào các biến cục bộ của đối tượng mà không để lộ chúng. Do đó, đặt chúng ở chế độ riêng tư một cách hiệu quả.

Việc đóng cũng có thể giúp bạn quản lý không gian tên chung của mình để tránh va chạm với dữ liệu được chia sẻ trên toàn cầu. Thông thường, tất cả các biến toàn cục được chia sẻ giữa tất cả các tập lệnh trong dự án của bạn, điều này chắc chắn sẽ mang lại cho bạn rất nhiều rắc rối khi xây dựng các chương trình từ trung bình đến lớn. Đó là lý do tại sao các tác giả thư viện và mô-đun sử dụng cách đóng để ẩn các phương pháp và dữ liệu của toàn bộ mô-đun. Đây được gọi là mẫu mô-đun, nó sử dụng biểu thức hàm được gọi ngay lập tức chỉ xuất một số chức năng nhất định ra thế giới bên ngoài, giảm đáng kể số lượng tham chiếu toàn cục.

Đây là một mẫu ngắn về khung mô-đun.

  var myModule = (function () = {
    let privateVariable = 'Tôi là một biến riêng';
    
    let method1 = function () {console.log ('Tôi là phương pháp 1'); };
    let method2 = function () {console.log ('Tôi là phương thức 2,', privateVariable); };
    
    trở về {
        method1: method1,
        method2: method2
    }
} ());

myModule.method1 (); // Tôi là phương pháp 1
myModule.method2 (); // Tôi là phương pháp 2, tôi là một biến riêng  

Đóng cửa rất hữu ích để nắm bắt các phiên bản mới của các biến riêng có trong môi trường 'đã nhớ' và những biến đó chỉ có thể được truy cập thông qua hàm hoặc các phương thức được trả về.

Vectors

Vector có lẽ là loại tập hợp đơn giản nhất trong Clojure. Bạn có thể nghĩ về nó giống như một mảng trong Javascript. Hãy xác định một vectơ đơn giản:

  (def a-vector [1 2 3 4 5])
;; Ngoài ra, hãy sử dụng hàm vectơ:
(định nghĩa một vectơ khác (vectơ 1 2 3 4 5))
;; Bạn có thể sử dụng dấu phẩy để phân tách các mục, vì Clojure coi chúng là khoảng trắng.
(def comma-vector [1, 2, 3, 4, 5])  

Bạn sẽ thấy rằng nó sử dụng dấu ngoặc vuông, giống như một mảng trong JS. Vì Clojure, giống như JS, được nhập động, vectơ có thể chứa các phần tử thuộc bất kỳ loại nào, kể cả các vectơ khác.

  (def Mixed-type-vector [1 "foo ": bar [" spam "22] #" ^ baz $ "])  

Thêm mục vào vectơ

Bạn có thể nối các mục vào một vectơ bằng cách sử dụng suggest . Bạn cũng có thể thêm trước vào danh sách bằng cách sử dụng thành , nhưng lưu ý rằng thành nhằm mục đích hợp nhất hai vectơ, vì vậy cả hai đối số của nó phải là vectơ và sử dụng thành < / code> chậm hơn so với việc sử dụng suggest .

 (time (obs [1 2] 3))
; = & gt; "Thời gian đã trôi qua: 0,032206 mili giây"
; [1 2 3]
(thời gian (vào [1] [2 3]))
; = & gt; "Thời gian đã trôi qua: 0,078499 msec"
; [1 2 3]  

IDEOne it!

Truy xuất các mục từ một vectơ

Bạn có thể truy xuất các mục từ một vectơ bằng cách sử dụng get . Điều này tương đương với việc sử dụng ký hiệu ngoặc để truy cập các mục trong một mảng bằng nhiều ngôn ngữ mệnh lệnh. Các mục trong vectơ được lập chỉ mục 0, tính từ bên trái.

  var arr = [1, 2, 3, 4, 5];
arr [0];
// = & gt; 1  

Trong Clojure, điều này sẽ được viết như vậy:

  (def a-vector [1 2 3 4 5 ])
(lấy a-vectơ 0)
; = & gt; 1  

Bạn cũng có thể cung cấp cho get một giá trị mặc định, nếu bạn cung cấp cho nó một chỉ mục không có trong mảng.

 < code class = "language-text"> ;; danh sách không có 2147483647 phần tử, vì vậy thay vào đó nó sẽ trả về một chuỗi.
(lấy a-vector 2147483646 "xin lỗi, không tìm thấy!")
; = & gt; "xin lỗi, không tìm thấy!"  

Chuyển đổi các tập hợp khác thành vectơ

Có thể được chuyển đổi thành vectơ bằng cách sử dụng hàm vec . Với bản đồ băm, điều này tạo ra một vectơ 2D chứa các cặp khóa và giá trị.

  (vec '(1 2 3 4 5))
; = & gt; [1 2 3 4 5]
(vec {: jack "black": barry "white"})
; = & gt; [[: jack "black"] [: barry "white"]]  

Khi nào sử dụng một vectơ?

Một vectơ nên được sử dụng trong hầu hết các trường hợp nếu bạn cần một bộ sưu tập, vì chúng có thời gian truy cập ngẫu nhiên ngắn nhất, giúp dễ dàng truy xuất các mục từ một vectơ. Lưu ý rằng các vectơ được sắp xếp theo thứ tự. Nếu thứ tự không quan trọng, có thể tốt hơn nếu sử dụng một bộ. Cũng lưu ý rằng vectơ được thiết kế cho các mục nối thêm; nếu bạn cần thêm các mục trước, bạn có thể muốn sử dụng một danh sách.

Thông tin thêm về Closures:


Xem thêm những thông tin liên quan đến chủ đề javascript đóng cửa là gì

JavaScript BRACKETS: What Are The Differences? | Parentheses, Curly Brackets, Square Brackets

  • Tác giả: Anna McDougall
  • Ngày đăng: 2021-01-01
  • Đánh giá: 4 ⭐ ( 8553 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Like, Comment, Subscribe.
    Follow me on Twitter: http://www.twitter.com/AnnaJMcDougall

    Blog post: "What is Closure?" https://blog.annamcdougall.com/seriously-though-what-on-earth-is-closure-ckg6kurqs00bj9cs14fvx9py9

    01:10 : Round brackets / Parentheses
    03:35: Square brackets
    05:10: Curly brackets

Hướng dẫn và ví dụ Javascript Window

  • Tác giả: openplanning.net
  • Đánh giá: 5 ⭐ ( 7831 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Node.js là gì? [đóng cửa]

  • Tác giả: qastack.vn
  • Đánh giá: 4 ⭐ ( 7511 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] Đã khóa . Có tranh chấp về nội dung câu trả lời này đang được giải…

Sự kiện (Event) trong JavaScript

  • Tác giả: vietjack.com
  • Đánh giá: 5 ⭐ ( 8551 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Sự kiện (Event) trong JavaScript - Học Javascript cơ bản và nâng cao cho người mới học từ Cú pháp Đối tượng Syntax Objects Form Validations Cookies Regular Expressions Literals Biến Hàm Phương thức Variables Vòng lặp Loops Điều kiện Conditions.

JavaScript Closure là gì?

  • Tác giả: hocjavascript.net
  • Đánh giá: 4 ⭐ ( 3413 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nói đến JavaScript, một phần quan trọng nhưng lại khá khó để nắm bắt, có thể nói nó là "thần thoại", là một phần của ngôn

Giới thiệu về Closures và Currying trong JavaScript

  • Tác giả: galaxyz.net
  • Đánh giá: 3 ⭐ ( 3552 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nếu bạn viết mã bằng JavaScript, rất có thể bạn đã gặp phải thuật ngữ closure , đây là một khái niệm hữu ích nhưng thường gây nhầm lẫn. Nhưng đóng cửa là gì?

Đóng tab hoặc cửa sổ trong JavaScript (window.close)

  • Tác giả: laptrinhcanban.com
  • Đánh giá: 5 ⭐ ( 6061 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hướng dẫn cách đóng cửa sổ trong JavaScript. Bạn sẽ biết cách sử dụng phương thức window.close để đóng cửa sổ trong JavaScript sau bài học này.

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Màu CSS trong suốt - css nền màu trong suốt