Hướng dẫn javascript closure - đóng javascript
Trong bài này chúng ta sẽ tìm hiểu hàm closure trong javascript, đây là một cách tạo hàm khá hay mà chắc hẳn các bạn đã gặp rất nhiều trong quá trình làm việc với javascript. Show
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.freetuts.net, không được copy dưới mọi hình thức. Closure function là một khái niệm không phải ai cũng biết và thực sự hiểu về nó. Đây được xem là một cách định nghĩa hàm giúp code nhìn trong sáng và sử dụng linh hoạt hơn. Vì vậy, nếu bạn muốn học javascript nâng cao hoặc học các framework khác thì phải hiểu về closure. Vậy closure là gì? Cách tạo closure như thế nào? Khi nào thì sử dụng hàm closure? Chúng ta cùng tìm hiểu ngay nhé. 1. Closure javascript là gì?Closure là một hàm được tạo ra từ bên trong một hàm khác, nó có thể sử dụng các biến toàn cục, biến cục bộ của hàm cha và biến cục bộ của chính nó. Việc viết hàm theo kiểu closure trong một số trường hợp sẽ giúp code nhìn sáng và dễ quản lý hơn, linh hoạt hơn trong một số trường hợp.hàm được tạo ra từ bên trong một hàm khác, nó có thể sử dụng các biến toàn cục, biến cục bộ của hàm cha và biến cục bộ của chính nó. Việc viết hàm theo kiểu closure trong một số trường hợp sẽ giúp code nhìn sáng và dễ quản lý hơn, linh hoạt hơn trong một số trường hợp. Bài viết này được đăng tại [free tuts .net]
Quay trở lại vấn đề chính của bài viết này, đó là closure trong js. Theo khái niệm của nó thì chúng ta chỉ việc tạo một hàm nằm bên trong một hàm khác thì đó chính là closure.closure trong js. Theo khái niệm của nó thì chúng ta chỉ việc tạo một hàm nằm bên trong một hàm khác thì đó chính là closure. Ví dụ dưới đây mình tạo một hàm function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }6: function sayHi(name){ let say = function(){ alert("Xin chào, tôi là " + name); }; return say; } Có thể bạn quan tâmTrong ví dụ này thì hàm function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }7 chính là một closure function. Bên trong nó có thể sử dụng được biến của hàm cha function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }8.closure function. Bên trong nó có thể sử dụng được biến của hàm cha function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }8. Bạn cũng có thể return về luôn thay vì đặt tên cho hàm closure đó. function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; } Bây giờ mình sẽ gọi đến hàm function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }9, và gán nó vào biến tên là var cuong = sayHi("Cường"); console.log(cuong);0. Sau đó mình log biến var cuong = sayHi("Cường"); console.log(cuong);0 này xem nó là gì nhé. var cuong = sayHi("Cường"); console.log(cuong); Kết quả trả vè nó là một function như sau: Lý do khá đơn giản, bởi vì trong hàm function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }9 mình return về một function, vì vậy biến var cuong = sayHi("Cường"); console.log(cuong);0 chính là function mà mình đã return đó. Để in ra thông báo thì chúng ta phải gọi kích hoạt function này. var cuong = sayHi("Cường"); cuong(); // Kết quả: Xin chào, tôi là cường Như vậy là bạn đã hiểu hàm closure trong javascript rồi phải không nào? Bây giờ mình sẽ đi tiếp phần 2 để nói về cách sử dụng biến cha trong closure function.closure function. 2. Closure trong javascript với biến của hàm chaTrước khi đi vào vấn đề chính thì mình xin nhắc lại hai lưu ý sau:
Bây giờ hãy tạo cho mình một function như sau: function counter(){ var count = 1; return function(){ return count++; }; } Hàm counter trả về một closure function, function đó có nhiệm vụ là tăng biến var cuong = sayHi("Cường"); console.log(cuong);4 lên 1 đơn vị và trả kết quả về. Mình sẽ gọi đến hàm counter như sau: Nếu theo quy tắc trên thì hàm var cuong = sayHi("Cường"); console.log(cuong);5 đã được chạy xong, và biến var cuong = sayHi("Cường"); console.log(cuong);6 bên trong hàm này đương nhiên là sẽ bị hủy. Tuy nhiên, nó vẫn còn tồn tại bên trong closure function nhé các bạn, bằng cách thực thi hàm var cuong = sayHi("Cường"); console.log(cuong);7 thì ta sẽ nhận được giá trị của biến count. var c = counter(); console.log(c()); // Kết quả: 1 Mình sẽ gọi hàm var cuong = sayHi("Cường"); console.log(cuong);7 thêm vài lần nữa. var c = counter(); console.log(c()); // Kết quả: 1 console.log(c()); // Kết quả: 2 console.log(c()); // Kết quả: 3 console.log(c()); // Kết quả: 4 Vậy, hàm closure có thể sử dụng các biến của hàm cha mặc dù hàm cha đã chạy xong. 3. Con trỏ this trong closure functionCũng như những function khác, nếu bạn đang chạy chế độ strict mode thì con trỏ this sẽ là undefined, còn không thì nó là đối tượng window. Chế độ bình thường function sayHi(){ return function(){ console.log(this); }; } var msg = sayHi(); msg(); // window object Chế độ strict mode 'use strict'; function sayHi(){ return function(){ console.log(this); }; } var msg = sayHi(); msg(); // Undefined 4. Closure trong class javascriptBạn có thể tạo một closure trong các phương thức của class. Tuy nhiên, vì var cuong = sayHi("Cường"); console.log(cuong);9 trong closure là undefined nên bạn không thể truy cập đến các thuộc tính của class. Có một mẹo khá đơn giản, đó là bạn tạo một biến và gán nó chính bằng con trỏ this ở trong các phương thức của classs. class Student{ constructor(name){ this.name = name; } showName(){ // Đặt một cái tên khác cho this let obj = this; return function(){ console.log("Xin chào, tôi là " + obj.name); }; } } var student1 = new Student("Cường"); var cuong = student1.showName(); cuong(); 5. Một vài ví dụ về closure trong javascriptTới đây thì chắc hẳn các bạn đã hiểu được khái niệm closure javascript là gì rồi phải không nào? Bây giờ ta sẽ thực hành thông qua một vài ví dụ, mỗi ví dụ là một trường hợp mà chắc chắn sau này bạn sẽ gặp khi làm việc với javascript. Closure có tham sốTrong ví dụ các phần trên trên mình tạo một closure không có tham số. Vậy nếu trường hợp có tham số thì cách viết như thế nào? Bạn xem ví dụ dưới đây sẽ hiểu. function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }0 Trong ví dụ này thì hàm var cuong = sayHi("Cường"); cuong(); // Kết quả: Xin chào, tôi là cường0 đã trả về một hàm closure, hàm này có một tham số var cuong = sayHi("Cường"); cuong(); // Kết quả: Xin chào, tôi là cường1. Return nhiều closure functionNếu bạn muốn return nhiều hàm closure thì bạn phải sử dụng một object, trong đó mỗi phần tử sẽ là một closure function. function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }1 Closure thay đổi giá trị biến toàn cục lẫn cục bộClosure có thể sử dụng biến ở 3 phạm vi: Thứ nhất là biến toàn cục, thứ hai là biến của hàm cha và thứ ba là biến của chính nó.: Thứ nhất là biến toàn cục, thứ hai là biến của hàm cha và thứ ba là biến của chính nó. Không chỉ sử dụng được mà nó còn có khả năng thay đổi giá trị của các biến đó. function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }2 6. Độ ưu tiên các biến trong closure functionNhư ta biết thì closure có thể sử dụng biến tại ba vị trí, đó là biến toàn cục, biến hàm cha và biến của chính nó.Giả sử tên các biến ở ba vị trí đó bị trùng nhau độ ưu tiên sẽ được sắp xếp như thế nào? Trường hợp này nó sẽ ưu tiên từ trong ra ngoài như sau:
Xem ví dụ sau: function sayHi(name){ return function(){ alert("Xin chào, tôi là " + name); }; }3 Trong ví dụ này thì biến var cuong = sayHi("Cường"); cuong(); // Kết quả: Xin chào, tôi là cường2 trong hàm closure chính là biến của hàm cha. 7. Lời kếtNhư vậy là chúng ta đã tìm hiểu xong khái niệm closure function trong javascript. Qua bài này hi vọng bạn đã hiểu và co thể trả lời trong các kì phỏng vấn sau này. Hãy luôn nhớ rằng closure là một khái niệm rất quan trọng, được sử dụng rất nhiều khi làm việc với javascript. Và nếu thấy bài viết hay thì hãy chia sẻ để ủng hộ cho mình nhé. |
Bài Viết Liên Quan
Bbia 02 giá bao nhiêu?
Chắc hẳn son là một sản phẩm không thể thiếu trong bộ đồ makeup của các chị em. Và hiện nay trên thị trường có rất nhiều dòng son để chị em thỏa mái ...
Làm cách nào để đếm số lần xuất hiện của từng ký tự trong một chuỗi trong JavaScript?
Thông thường trong lập trình, mọi nhà phát triển cần đếm từng lần xuất hiện của một ký tự trong chuỗi hoặc câu trong một số tình huống. Trong bài viết ...
Thay đổi màu chữ trong php
Hôm nay chúng ta sẽ tìm hiểu cách điều chỉnh Font chữ, màu chữ và cỡ chữ sao cho phù hợp với nội dung của trang web, cũng như làm nổi bật một số từ ...
Tuyển dụng bóng đá trường trung học Oregon 2023
Trong vài năm qua, tôi có xu hướng ở lại làn đường của mình. Có nghĩa là chủ yếu thực hiện các lựa chọn có lợi cho Oregon đối với các mục tiêu chính ...
Làm thế nào để bạn trả về một danh sách từ một lớp trong python?
Trong bài học này, bạn sẽ tìm hiểu về các phương thức tích hợp bổ sung, không giống như các phương thức trong bài học trước, có các giá trị trả về.pop() ...
Tại sao vòng lặp while của tôi không hoạt động Python?
Vòng lặp While trong Python được sử dụng để thực thi lặp đi lặp lại một khối câu lệnh cho đến khi một điều kiện nhất định được thỏa mãn. Và khi ...
Dữ liệu có thể được phân loại thành bao nhiêu nhóm trong python
Trong số này, bước tách là đơn giản nhất. Trên thực tế, trong nhiều tình huống, chúng tôi có thể muốn chia tập dữ liệu thành các nhóm và làm gì đó với ...
Python cho AI và ML
Nếu bạn mới bắt đầu làm quen với thế giới trí tuệ nhân tạo (AI), thì Python là một ngôn ngữ tuyệt vời để học vì hầu hết các công cụ đều được ...
Javascript kiểm tra xem số có phải là lũy thừa của 2 không
Mục lụcTrong hướng dẫn này, chúng ta sẽ xem cách kiểm tra xem số có phải là lũy thừa của hai hay khôngCó nhiều cách để kiểm tra xem một số có phải là lũy ...
Bạn có thể biên dịch python thành assembly không?
Tiết lộ. Bài đăng này có thể chứa các liên kết liên kết, nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi sẽ nhận được hoa hồngBộ xử lý ...
Máy tính công thức Pascals
Chào mừng bạn đến với máy tính tam giác Pascal của chúng tôi, nơi bạn sẽ tìm hiểu cách sử dụng tam giác Pascal, cũng như lý do tại sao bạn nên sử dụng nó ...
3 tỷ Việt Nam bằng bao nhiêu USD
Bộ chuyển đổi Đô la Mỹ/Đồng Việt Nam được cung cấp mà không có bất kỳ bảo hành nào. Giá có thể khác với giá của các tổ chức tài chính như ngân ...
Cách hiển thị dữ liệu json trong bảng html bằng javascript?
Định dạng JSON được sử dụng nhiều để lưu trữ dữ liệu theo cách có cấu trúc. Ngay cả dữ liệu nhận được từ máy chủ cũng ở định dạng JSON. Ở ...
Có bao nhiêu tháng cho đến ngày 4 tháng 8 năm 2023
Có 193 ngày cho đến ngày 4 tháng 8Khoảng thời gian từ ngày 23 tháng 1 năm 2023 đến ngày 4 tháng 8 năm 2023Ngày này cách đây 6 tháng 11 ngày. Hơn hai mươi bảy tuần ...
Sử dụng biến trong đường dẫn tệp python
Bởi vì trình bao mặc định của bạn trong Terminal là zsh. So sánh những điều sau đây (_______74_______ in tên của shell hiện tại)user-166% echo $0 zsh user-166% ...
Chức năng ngủ trong PHP là gì?
Khi bạn muốn tạm dừng thực thi trong tập lệnh của mình, có hai cách để bạn triển khai mã. Một số người (rất may là rất ít) chọn tùy chọn đầu tiên và ...
Gốc sudo mysql
Nội dungTrong bài hướng dẫn này mình sẽ chỉ các bạn cách cài đặt MySQL trên Ubuntu 20. 04You can you likeCài đặt WireGuard với Docker Compose trên Ubuntu 22. 04Hướng ...
Làm cách nào để bạn thêm nhiều đối tượng trong javascript?
Các mảng JavaScript đi kèm với một phương thức sắp xếp tích hợp. Phương thức sắp xếp này chuyển đổi các phần tử mảng thành chuỗi và thực hiện sắp ...
Thêm dấu phẩy vào mảng python
Sử dụng phương pháp str.join() để chuyển đổi danh sách thành chuỗi được phân tách bằng dấu phẩy, e. g. my_str = ,.join(my_list). Phương thức str.join() sẽ nối ...
Làm cách nào để sử dụng phạm vi trong vòng lặp PHP?
Một vòng lặp foreach trong PHP là hoàn hảo để lặp qua các phần tử của một mảng được lập chỉ mục hoặc một mảng kết hợp. Vòng lặp sẽ bắt đầu từ ...