1748075
Bao đóng (lập trình máy tính)
https://vi.wikipedia.org/wiki?curid=1748075
Title: Bao đóng (lập trình máy tính)
 f = function() { return ++x; };
 g = function() { return --x; };
 x = 1;
 alert('Bên trong foo, gọi hàm f(): ' + f()); // hiện ra giá trị "2"
foo();
alert('Gọi hàm g(): ' + g()); // hiện ra giá trị "1"
alert('Gọi hàm f(): ' + f()); // hiện ra giá trị "2"
Trong ví dụ trên hàm codice_6 và các bao đóng được tham chiếu bởi các biến codice_7 và biến codice_8 đều sử dụng chung một vùng bộ nhớ khi truy cập biến codice_2. Chính vì vậy giá trị của x đều thay đổi sau mỗi lần gọi hàm codice_6 hay gọi các hàm qua các bao đóng codice_7 và biến codice_8
Trong khi đó rất nhiều các ngôn ngữ lập trình khác, ví dụ như ngôn ngữ ML, việc gắn kết biến lại đi liền trực tiếp với giá trị của biến. Kiểu lưu giữ này được gọi là lưu giữ bằng giá trị (capturing by value)
Một số ngôn ngữ cho phép chúng ta lựa chọn kiểu lưu trữ theo ý muốn. Ví dụ trong ngôn ngữ C++11 hay PHP, chúng ta sử dụng từ khóa codice_13 để lưu trữ biến theo tham chiếu. Khi không dùng từ khóa đó, các biến sẽ được lưu trữ theo giá trị.
Thoát khỏi phạm vi tác dụng.
Các ngôn ngữ lập trình khác nhau cũng có sự khác nhau trong việc thoát khỏi phạm vi tác dụng xác định bởi các lệnh của ngôn ngữ đó, ví dụ: codice_14, codice_15 hay codice_16.
Ví dụ sau chỉ ra sự khác biệt trong hai ngôn ngữ Smalltalk và ECMAScript:
"Smalltalk"
foo
 | xs |
 xs:= #(1 2 3 4).
 xs do: [:x | ^x].
 ^0
bar
 Transcript show: (self foo printString) "in ra kết quả 1"
// ECMAScript
function foo() {
 var xs = [1, 2, 3, 4];
 xs.forEach(function (x) { return x; });
 return 0;
alert(foo()); // in ra kết quả 0