11/08/2018, 20:17

scope và closure là khỉ gỉ ?

Scope = cửa hậu aka lỗ đen. Black holes are where God divided by zero - Albert Einstein Chúng ta là những lập trình viên thiên tài, chúng ta thổi hồn vào vạn vật, đôi khi trong quá trình sáng tác ra một chương trình vĩ đại với hàng hà sa số bug nhỏ bug to hô to gọi nhỏ, chúng ta mơ ...

Scope = cửa hậu aka lỗ đen.

Black holes are where God divided by zero - Albert Einstein

alt text

Chúng ta là những lập trình viên thiên tài, chúng ta thổi hồn vào vạn vật, đôi khi trong quá trình sáng tác ra một chương trình vĩ đại với hàng hà sa số bug nhỏ bug to hô to gọi nhỏ, chúng ta mơ hồ có một cảm giác lạ lùng, biết dek đâu dc, bản thân mình chính là đấng sáng thế, khai sinh ra vũ trụ này, vĩ đại vl ơ kìa :)

Scope, như vô vàng mấy cái khái niệm mà cứ hỏi bác gút là ra cả đống, chẳng thể nào làm khó được chúng ta, bởi vì chúng ta là vũ trụ sáng tạo giả, mà scope chẳng qua chỉ là 1 cái lỗ đen bé tí. Lỗ đen nghĩa đen chứ ko phải cái cửa hậu của các anh các chị đâu đấy.

Thật vậy, scope là 1 lỗ đen, bởi vì biến nhỏ biến to nằm ngoài scope đều có thể bị hút vào bên trong để sử dụng, trong khi bất cứ của nợ gì, nếu sinh ra trong scope, thì tuyệt đối khó thoát khỏi cảnh chim chậu cá lồng hoặc chim lồng cá chậu, hoặc sao đó tôi quên mẹ rồi.

Mà để tạo ra lỗ đen scope, cách đơn giản nhất là dùng function. Mà cũng có mổi cách ấy thôi cho đến khi es6 ra đời.

Tỉ dụ là

var name = "Minh Béo", gender = ';

function isHandsome() {
  var gender = 'nhưng gay vl';
  console.log(name + ' anh tuấn tiêu sái, ngọc thụ lâm phong');
}
isHandsome();
console.log(gender || 'mà lại chuẩn men');
// in ra Minh Béo anh tuấn tiêu sái, ngọc thu lâm phong
// mà lại chuẩn men

Đoạn code trên giải thích cũng đơn giản, này nhé function isHandsome tạo ra 1 lỗ đen scope bên trong nó, biến name lại dc khai báo ở bên ngoài, như thế name có thể bị hút vào để sử dụng. kết quả in ra giá trị Minh Béo không có gì bất ngờ.

Còn ở bên trong lỗ đen, tôi cố tình khai báo giới tính của minh béo là gay, giới tính này sinh ra ở trong lỗ đen, vì vậy ở lại bên trong lỗ đen, ở bên ngoài không ai biết, chả ai hay. Cho nên khi gọi console.log(gender) nó sẽ log ra chuẩn men, bởi vì gender vẫn empty.

Lỗ đen là một khái niệm không xa lạ đối với mọi người, ngay cả ánh sáng còn không thoát ra dc lỗ đen thì nói gì đến cái giới tính bê đê của đồng chí Minh béo.

Tất nhiên khó với ai chứ với vũ trụ sáng tạo giả, đem giới tính của minh béo ra khỏi lỗ đen là một chuyện đơn giản, chỉ cần giơ tay nhấc chân, đánh ra tuyệt chiêu bí truyền, có tên gọi là băng phong thiên địa, chúng ta sẽ mang minh béo bê đê ra ánh sáng.

Closure = băng phong thiên địa.

chủ nói: thế giới này phải có ánh sáng ... một đạo hào quang xuyên thủng thiên địa, lập tức xuyên thấu vũ trụ thông đạo đánh vào sâu trong vũ trụ
thần toạ hoàng phủ kỳ

Để mang một vật ra khỏi lỗ đen, ta phải đóng băng toàn bộ lãnh thổ của lỗ đen, để làm việc đó chúng ta dùng chiu băng phong thiên địa, tụi mẻo gọi là closure hay lexical scope hay static scope, nói chung tụi mẻo rảnh vl gọi đủ thứ tên, hại bố mày nhớ vất hết cả vả !

Lấy cái ví dụ là

function xo_so_kien_thiet() {
  var luckyNumber = Math.floor(Math.random() * 10);

  // closure đây
  return function bang_phong_thien_dia() {
    return luckyNumber;
  }
}

var soi_ket_qua = xo_so_kien_thiet();
console.log(soi_ket_qua());
console.log(soi_ket_qua());
console.log(soi_ket_qua());
// 3 lần gọi console.log, sẽ cho ra cùng 1 kết quả.

Trong ví dụ trên, khi ta gọi xo_so_kien_thiet, nó sẽ return function bang_phong_thien_dia của chúng ta, và gán vào biến soi_ket_qua, nhiệm vụ của function trả về này là đóng băng toàn bộ lỗ đen, bao gồm biến luckyNumber sinh ra trong lỗ đen đó, sẳn sàng trả giá trị về cho vũ trụ bên ngoài.

Do đó, luckyNumber đúng ra chỉ tồn tại trong lỗ đen scope, đã dc thấy ánh sáng bên ngoài. Gọi soi_ket_qua 3 phát chỉ ra đúng 1 số, chứng tỏ Math.random chỉ dc chạy 1 lần, sau khi bị lợi dụng moi ra dc giá trị, là nó bị đóng băng luôn.

Túm cái váy lại vậy thì closure là gì ?

Closure là cách mà chúng ta đưa một biến sinh ra trong lỗ đen scope, ra thế giới bên ngoài bằng cách đóng gói cái biến đó, vào một function, sau đó chọi ra bên ngoài. Function này gọi là enclosing function -- do đó mới có tên là closure.

Thôi chào các bác, scope của em biểu tình rồi, em phải đi closure vài thứ bên trong ra. Hẹn các bác vào một dịp khác !

0