12/08/2018, 15:31

Kiến thức cần phải biết trong javascript: closure.

Khi tìm hiểu và làm việc với javascript, chúng ta thường xuyên bắt gặp những vấn đề liên quan tới "closure". Đặc biệt là với những lập trình viên mới bắt đầu với javascript và đa phần trong số này chỉ dùng closure theo kiểu thấy người ta dùng thì dùng, đôi khi xảy ra lỗi cũng chẳng biết là tại sao. ...

Khi tìm hiểu và làm việc với javascript, chúng ta thường xuyên bắt gặp những vấn đề liên quan tới "closure". Đặc biệt là với những lập trình viên mới bắt đầu với javascript và đa phần trong số này chỉ dùng closure theo kiểu thấy người ta dùng thì dùng, đôi khi xảy ra lỗi cũng chẳng biết là tại sao. Hơn thế nữa, việc này sẽ khiến cho lập trình viên không tận dụng hết được sức mạnh của closure. Vì vậy, việc hiểu biết và sử dụng closure là một điều rất quan trọng và hữu ích trong việc code javascript. Trong bài viết này, mình sẽ giới thiệu về những điều thú vị về closure trong javascript. 1. Khái niệm. Hiểu một cách đơn giản, Closure là một hàm nằm bên trong một hàm khác mà nó có thể truy cập đến các biến ở trong hàm đó. Closure có thể truy cập: biến bên trong chính closure đó, biến bên trong hàm mà nó được bao bọc và biến global. Ví dụ:

testGlobalVar = "global";
	
	function A(a1, a2) {
		//
		this.a1 = a1;
		this.a2 = a2;
	}

	function testClosure(a) {


		console.log(arguments[0]);
		var closureVariable = 0;
		function testParameterObject() {
			console.log(arguments[0]);
			console.log(testGlobalVar);
			console.log(closureVariable);
			console.log(a.a1);
			console.log(a.a2);
		}

		return testParameterObject;
	}

	var a = new A(1, 2);

	var test = testClosure(a);
	test();//result: A {a1: 1, a2: 2} /n undefined global /n 0 /n 1 /n 2

Ở ví dụ trên, chúng ta có thể thấy closure không chỉ truy cập được biến từ hàm bao ngoài nó, mà còn có thể gọi trực tiếp parameters từ hàm bao ngoài. Tuy nhiên, nó không thể gọi đến đối tượng arguments của hàm bao ngoài.

0