“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.