Chương trình về bao đóng trong JavaScript

“Master the JavaScript Interview” là một loạt bài đăng được thiết kế để chuẩn bị cho các ứng viên những câu hỏi phổ biến mà họ có thể gặp phải khi ứng tuyển vào vị trí JavaScript cấp trung đến cấp cao. Đây là những câu hỏi tôi thường xuyên sử dụng trong các cuộc phỏng vấn thực tế

Tôi đang khởi động loạt bài với câu hỏi $40k. Nếu bạn trả lời sai câu hỏi này, rất có thể bạn sẽ không được tuyển dụng. Nếu bạn được tuyển dụng, rất có thể bạn sẽ được tuyển dụng với tư cách là nhà phát triển cơ sở, bất kể bạn đã làm việc với tư cách là nhà phát triển phần mềm trong bao lâu. Trung bình, các nhà phát triển cơ sở được trả ít hơn 40.000 USD/năm so với các kỹ sư phần mềm có kinh nghiệm hơn

Các bao đóng rất quan trọng vì chúng kiểm soát những gì có và không có trong phạm vi trong một hàm cụ thể, cùng với các biến nào được chia sẻ giữa các hàm anh chị em trong cùng một phạm vi chứa. Hiểu cách các biến và hàm liên quan với nhau là rất quan trọng để hiểu điều gì đang xảy ra trong mã của bạn, theo cả phong cách lập trình hướng đối tượng và chức năng

Lý do khiến việc bỏ lỡ câu hỏi này trở nên bất lợi trong cuộc phỏng vấn là do sự hiểu lầm về cách thức hoạt động của bao đóng là một dấu hiệu khá rõ ràng có thể cho thấy bạn thiếu kinh nghiệm sâu sắc, không chỉ trong JavaScript mà còn trong bất kỳ ngôn ngữ nào phụ thuộc nhiều vào bao đóng [

Viết mã JavaScript mà không hiểu về bao đóng cũng giống như cố gắng nói tiếng Anh mà không hiểu các quy tắc ngữ pháp — bạn có thể hiểu ý tưởng của mình, nhưng có thể hơi lúng túng

Bạn cũng sẽ dễ bị hiểu lầm khi cố gắng hiểu những gì người khác viết

Bạn không chỉ cần biết bao đóng là gì mà còn phải biết tại sao nó lại quan trọng và có thể dễ dàng trả lời một số trường hợp sử dụng có thể có cho bao đóng

Các bao đóng thường được sử dụng trong JavaScript để bảo mật dữ liệu đối tượng, trong các trình xử lý sự kiện và các hàm gọi lại cũng như trong các ứng dụng một phần, currying và các mẫu lập trình chức năng khác

Nếu bạn không thể trả lời câu hỏi này, nó có thể khiến bạn mất việc, hoặc ~$40k/năm

Hãy chuẩn bị để theo dõi nhanh chóng. “Bạn có thể đặt tên cho hai cách sử dụng phổ biến cho việc đóng cửa không?”

Đóng cửa là gì?

Bao đóng là sự kết hợp của một chức năng được nhóm lại với nhau [kèm theo] với các tham chiếu đến trạng thái xung quanh của nó [môi trường từ vựng]. Nói cách khác, một bao đóng cho phép bạn truy cập vào phạm vi của chức năng bên ngoài từ một chức năng bên trong. Trong JavaScript, các bao đóng được tạo mỗi khi một hàm được tạo, tại thời điểm tạo hàm

Để sử dụng bao đóng, hãy xác định một hàm bên trong một hàm khác và hiển thị nó. Để hiển thị một chức năng, hãy trả lại hoặc chuyển nó sang một chức năng khác

Hàm bên trong sẽ có quyền truy cập vào các biến trong phạm vi hàm bên ngoài, ngay cả sau khi hàm bên ngoài đã trả về

Sử dụng Closures [Ví dụ]

Trong số những thứ khác, bao đóng thường được sử dụng để cung cấp quyền riêng tư cho dữ liệu của đối tượng. Quyền riêng tư dữ liệu là thuộc tính thiết yếu giúp chúng tôi lập trình giao diện chứ không phải triển khai. Đây là một khái niệm quan trọng giúp chúng tôi xây dựng phần mềm mạnh mẽ hơn vì các chi tiết triển khai có nhiều khả năng thay đổi theo cách phá vỡ hơn so với hợp đồng giao diện

“Chương trình hướng tới giao diện, không phải triển khai. ”
Mẫu thiết kế. Các yếu tố của phần mềm hướng đối tượng tái sử dụng

Trong JavaScript, bao đóng là cơ chế chính được sử dụng để cho phép bảo mật dữ liệu. Khi bạn sử dụng bao đóng để bảo mật dữ liệu, các biến kèm theo chỉ nằm trong phạm vi của hàm chứa [bên ngoài]. Bạn không thể lấy dữ liệu từ phạm vi bên ngoài ngoại trừ thông qua các phương thức đặc quyền của đối tượng. Trong JavaScript, bất kỳ phương thức tiếp xúc nào được xác định trong phạm vi đóng đều có đặc quyền. Ví dụ

Chơi với cái này trong JSBin. [Không thấy bất kỳ đầu ra nào? Sao chép và dán mã HTML này vào khung HTML. ]

Trong ví dụ trên, `. phương thức get[]` được xác định bên trong phạm vi của `getSecret[]`, cho phép nó truy cập vào bất kỳ biến nào từ `getSecret[]`, và làm cho nó trở thành một phương thức đặc quyền. Trong trường hợp này, tham số, `bí mật`

Các đối tượng không phải là cách duy nhất để tạo ra quyền riêng tư dữ liệu. Bao đóng cũng có thể được sử dụng để tạo các hàm trạng thái có giá trị trả về có thể bị ảnh hưởng bởi trạng thái bên trong của chúng, e. g

const secret = msg => [] => msg;

Có sẵn trên JSBin. [Không thấy bất kỳ đầu ra nào? Sao chép và dán mã HTML này vào khung HTML. ]

Trong lập trình chức năng, các bao đóng thường được sử dụng cho ứng dụng một phần & cà ri. Điều này đòi hỏi một số định nghĩa

Đăng kí. Quá trình áp dụng một hàm cho các đối số của nó để tạo ra một giá trị trả về

ứng dụng một phần. Quá trình áp dụng một chức năng cho một số đối số của nó. Hàm được áp dụng một phần được trả lại để sử dụng sau. Ứng dụng một phần sửa lỗi [áp dụng một phần hàm cho] một hoặc nhiều đối số bên trong hàm được trả về và hàm được trả về sẽ lấy các tham số còn lại làm đối số để hoàn thành ứng dụng hàm

Ứng dụng một phần tận dụng phạm vi đóng để sửa các tham số. Bạn có thể viết một hàm chung sẽ áp dụng một phần đối số cho hàm đích. Nó sẽ có chữ ký sau

partialApply[targetFunction: Function, ...fixedArgs: Any[]] =>
functionWithFewerParams[...remainingArgs: Any[]]

Nếu bạn cần trợ giúp đọc chữ ký ở trên, hãy xem Rtype. Chữ ký chức năng đọc

Nó sẽ nhận một hàm nhận bất kỳ số lượng đối số nào, theo sau là các đối số mà chúng ta muốn áp dụng một phần cho hàm và trả về một hàm sẽ nhận các đối số còn lại

Một ví dụ sẽ giúp. Giả sử bạn có một hàm cộng hai số

const add = [a, b] => a + b;

Bây giờ bạn muốn một chức năng thêm 10 vào bất kỳ số nào. Chúng tôi sẽ gọi nó là `add10[]`. Kết quả của `add10[5]` phải là `15`. Hàm `partialApply[]` của chúng tôi có thể biến điều đó thành hiện thực

const add10 = partialApply[add, 10];
add10[5];

Trong ví dụ này, đối số, `10` trở thành tham số cố định được ghi nhớ bên trong phạm vi đóng `add10[]`

Hãy xem cách triển khai `partialApply[]` khả thi

Có sẵn trên JSBin. [Không thấy bất kỳ đầu ra nào? Sao chép và dán mã HTML này vào khung HTML. ]

Như bạn có thể thấy, nó chỉ trả về một hàm duy trì quyền truy cập vào các đối số `fixedArgs` đã được chuyển vào hàm `partialApply[]`

Lượt của bạn

Bài đăng này có một bài đăng video đi kèm và bài tập thực hành cho các thành viên của EricElliottJS. com. Nếu bạn đã là thành viên, hãy đăng nhập và luyện tập ngay

Nếu bạn chưa phải là thành viên, hãy đăng ký ngay hôm nay

Khám phá sê-ri

  • Đóng cửa là gì?
  • Sự khác biệt giữa kế thừa lớp và nguyên mẫu là gì?
  • Hàm thuần túy là gì?
  • Thành phần chức năng là gì?
  • Lập trình chức năng là gì?
  • Lời hứa là gì?
  • Các kĩ năng mềm

Cập nhật.
Tháng 7 năm 2019 — Phần giới thiệu rõ ràng để giải thích tại sao trả lời sai câu hỏi này có thể khiến bạn mất việc hoặc mất nhiều tiền lương.

Bắt đầu bài học miễn phí của bạn trên EricElliottJS. com

Eric Elliott là cố vấn nền tảng và sản phẩm công nghệ, tác giả của “Phần mềm soạn thảo”, đồng sáng lập của EricElliottJS. com và DevAnywhere. io và cố vấn nhóm phát triển. Anh ấy đã đóng góp vào trải nghiệm phần mềm cho Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC và các nghệ sĩ thu âm hàng đầu bao gồm Usher, Frank Ocean, Metallica, v.v.

Các ví dụ về bao đóng trong JavaScript là gì?

function sayHello[] { var say = function[] { console. nhật ký [xin chào]; . '; . '

Làm cách nào để đạt được sự đóng cửa trong JavaScript?

Trong JavaScript, bao đóng được tạo mỗi khi một hàm được tạo, tại thời điểm tạo hàm. Để sử dụng bao đóng, hãy xác định hàm bên trong hàm khác và hiển thị hàm đó . Để hiển thị một chức năng, hãy trả lại hoặc chuyển nó sang một chức năng khác.

Điều nào sau đây là đóng trong JavaScript?

Giải thích. Sự kết hợp giữa đối tượng hàm và phạm vi [tập hợp các ràng buộc biến] trong đó các biến của hàm được giải quyết được gọi là bao đóng.

Mục đích của bao đóng trong JavaScript là gì?

Trong JavaScript, các bao đóng đượ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ả về

Chủ Đề