fbpx

Bài 6: Anonymous Function và Closure

Trong bài viết trước, khi tìm hiểu về cách viết Hàm trong Javascript , các bạn sẽ thấy rằng nó hoàn toàn không khác gì các ngôn ngữ phổ biến như C++, C#, Java…nhưng trong nó còn hỗ trợ một cách viết khác cũng không kém phần thú vị và nó có tên gọi là Anonymous Function, tuy nhiên ở một số trường hợp nó lại trở thành khái niệm khác và có tên gọi là Closure. Vậy do đâu mà có sự khác biệt như vậy giữa Anonymous Function va Closure? Các bạn hãy cùng tìm hiểu với tôi nhé.

Anonymous Function và Closure

 

Bài viết đang củng cố lại học thuật, vì có kiến thức lúc tác giả viết bài này vẫn chưa chính xác. Độc giả vui lòng quay lại khi khác. Xin cám ơn các bạn độc giả đã quan tâm.

Để giải thích các khái niệm này và hiểu được nó sẽ mất rất nhiều thời gian của các bạn. Tuy nhiên, các bạn có thể hiểu đơn giản như sau:

Anonymous Function (Hàm vô danh)

<script type="text/javascript">
	var func = function() {
		alert("Hello");
	}
	func();
</script>

Kết quả:

Hello (Hiển thị hộp thoại)

Closure (Bao đóng)

(Vui lòng bật F12 trên Chrome/Firefox và chuyển sang Tab Console để thấy kết quả)

<script type="text/javascript">
	var action = 'Hello';
	var closure = function(name) {
		console.log(action + ' ' + name);
	}
	closure('Andy Vũ');
</script>

Kết quả:

Hello Andy Vũ

Khi đến với 2 kiểu dữ liệu cuối cùng, chắc hẳn các bạn sẽ có nhiều thắc mắc về nó rất nhiều. Vậy đâu là sự khác biệt giữa Anonymous Function và Closure?

Anonymous Function thực chất chỉ là một hàm không có tên gọi, thường được sử dụng khi xử lý các công việc có quy mô nhỏ, vì thế không cần thiết phải khởi tạo tên định danh cho hàm này. Giúp nó có tốc độ xử lý nhanh hơn hàm truyền thống phải có tên định danh.

Closure có các tính chất của Anonymous Function đó chính là không cần tên định danh cho nó. Nhưng để được gọi là Closure thì trong nó phải sử dụng ít nhất là một biến không phụ thuộc vào phạm vi hàm mà chúng ta định nghĩa.

Hãy xem qua 3 ví dụ chi tiết sau đây:

VD 1: Các trường hợp của Anonymous Function

<script type="text/javascript">
	//Anonymous Function có đối số
	var anonymous = function(a, b) {
		return a + b;
	};
	console.log(anonymous(5, 10));
	//Anonymous Function không có đối số
	var anonymous = function() {
		return "Hello World";
	};
	console.log(anonymous());
</script>

Kết quả:

15
Hello World!

Qua ví dụ trên, bạn đã phần nào hiểu rõ về Anonymous Function rồi có đúng không? Nó chỉ được gọi là Anonymous Function khi nó không sử dụng biến nào bên ngoài hàm hay nói cách khác là không được phép sử dụng biến toàn cục trong hàm này.

VD 2: Các trường hợp của Closure

1. Kết hợp Anonymous Function và Closure

<script type="text/javascript">
	//Kết hợp Anonymous Function và Closure
	var anonymous = function() {
		var a = 'A thuộc Anonymous Function';
		var closure = function() {
			var b = 'B thuộc Closure';
			console.log(a);
			return b;
		}	
		console.log(closure());
		b = 'B thuộc Anonymous Function';
		console.log(closure());
		console.log(b);
	};
	anonymous();
</script>

Kết quả:

A thuộc Anonymous Function
B thuộc Closure
A thuộc Anonymous Function
B thuộc Closure
B thuộc Anonymous Function
  • Biến “anonymous” được xem là Anonymous Function bởi vì chính nó không dùng biến bên ngoài hàm được định nghĩa.
  • Biến “closure” được xem là “Closure” bởi vì nó đã sử dụng biến “a” (Biến toàn cục trong hàm “anonymous”) thuộc “anonymous” có phạm vi ảnh hưởng rộng hơn trong “closure” cho phép “closure” có thể gọi giá trị bên ngoài và tác động đến giá trị đó, cụ thể ở đây là biến “a”.
  • Biến “b” trong “closure” được định nghĩa trong phạm vi của “closure” vì thế, nếu nó được dùng trong “anonymous” tức là bên ngoài “closure” sẽ không được phép truy cập vào hoặc tác động được vào giá trị của nó.
  • Biến “b” trong “anonymous” được định nghĩa là biến toàn cục (khi không có từ khóa “var”) có thể được truy xuất ở nơi không được định nghĩa lại biến “b” như trong “closure” đã định nghĩa biến “b” như trước đó. Và nó có thể cho phép truy xuất cả bên ngoài “anonymous” mà không gặp bất cứ lỗi nào. Đó là một trong những vấn đề rất quan trọng khi dùng từ khóa “var” và khi không dùng từ khóa “var”. Vì thế các bạn đã thấy biến “b” trong “closure” và biến “b” ở “anonymous” được định nghĩa lại hoàn toàn không tác động gì được trong phạm vi của “closure”. Các bạn có thể xem ví dụ về vấn đề này rõ hơn ở Ví dụ bên dưới.

2. Phạm vi của biến trong và ngoài Closure

<script type="text/javascript">
	//Closure
	var c = 'C là biến toàn cục';
	var closure = function() {
		c = 'C đã bị ảnh hưởng bởi Closure';
		var d = 'D thuộc Closure';
		var child_closure = function() {
			c = 'C đã bị ảnh hưởng bởi Child Closure';
			d = 'D đã bị ảnh hưởng bởi Child Closure';
			return c;
		}	
		console.log(child_closure());
		return d;		
	}
	console.log(closure());
	console.log(c);
	console.log(d);
</script>

Kết quả:

C đã bị ảnh hưởng bởi Child Closure
D đã bị ảnh hưởng bởi Child Closure
C đã bị ảnh hưởng bởi Child Closure	
Uncaught ReferenceError: d is not defined
  • Như ví dụ bên trên mà tôi đã viết, các bạn sẽ thấy được rõ ràng phạm vi của biến được sử dụng trong ví dụ này.
  • Trong đó, biến “c” được định nghĩa là biến toàn cục thay vì cục bộ trong một hàm cho dù nó có từ khóa “var” bởi vì nó đã được định nghĩa bên ngoài tất cả các hàm bao hàm lấy nó, nên nó cũng được xem là biến toàn cục trong trường hợp này.
  • Và khi biến “c” được tác động trong “closure”, nó cũng sẽ thay đổi giá trị của biến “c” bên ngoài nó bởi vì nó là biến toàn cục.
  • Biến “d” được khởi tạo trong “closure” chỉ được hiểu trong phạm vi của “closure” nên vì thế các bạn sẽ thấy lỗi khi chạy đoạn chương trình tôi cung cấp, vì nó không tìm thấy biến “d” ở phạm vi ngoài “closure”.
  • Tương tự với hàm “child_closure”, nó cũng đã sử dụng biến bên ngoài phạm vi của nó đó chính là biến “c” toàn cục và biến “d” ở “closure”. Và khi đó, biến “d” nằm trong phạm vi của “closure” và khi đó “child_closure” cũng nằm trong phạm vi của “closure” vì thế biến “d” hoàn toàn cũng được phép truy cập vào biến “d” của “closure” và thay đổi giá trị của nó.

Qua các ví dụ trên, chắc hẳn nếu bạn nào vẫn còn bối rối với phạm vi của biến có từ khóa “var” và không có từ khóa “var” hoặc với phạm vi của “Closure”. Tôi đề nghị các bạn nên thử cách viết và cách sử dụng biến trong Javascript để có thể hiểu rõ về nó hơn thay vì chỉ đọc và ngẫm. Như vậy bạn sẽ có trải nghiệm về nó một cách chính xác hơn.

Sau khi tìm hiểu về Anonymous Function và Closure trong Javascript (JS) chắc hẳn các bạn đã thấy được nhiều điều thú vị từ nó. Trong các bài viết sau, chúng ta sẽ tập trung vào tìm hiểu Javascript và HTML DOM cũng như các ví dụ thực tế và một số thủ thuật khi viết code trong Javascript và giải đáp thắc mắc một số cách ghi tắt trong Javascript.

Bài 5: Hàm trong Javascript

Như vậy, sau khi trải qua các bài học trước về Kiểu dữ liệuPhạm vi hoạt độngToán tử và Biểu thức trong Javascript (JS). Các bạn đã có những kiến thức nền tảng giúp cho việc lập trình sau này được bài bản và khoa học hơn. Đến với bài này, chúng ta cùng nhau tìm hiểu về Hàm trong Javascript.

Hàm trong Javascript

Hàm trong Javascript

Hàm hay chương trình con giúp chúng ta có thể thực hiện những công việc nào đó mà ta đã xây dựng sẵn, nó được dùng khi chúng ta xây dựng thư viện hay đệ quy. Giúp gói gọn những công việc mà chúng ta có nhu cầu sau này sử dụng lại.

Cú pháp

<script type="text/javascript">
	//Hàm không cần giá trị trả về 
	function tenFunction(doiSo1, doiSo2, ...) {
		//Công việc cần xử lý
	}

	//Hàm cần giá trị trả về
	function tenFunction(doiSo1, doiSo2, ...) {
		return giaTriTraVe;
	}
</script>
  • Khi định nghĩa hàm, chúng ta sẽ có hai lựa chọn đó là hàm trả về hay hàm không trả về giá trị.

 

Ví dụ

Trường hợp 1:

(Vui lòng bật F12 trên Chrome/Firefox và chuyển sang Tab Console để thấy kết quả)

<script type="text/javascript">
	var a = 5;
	var b = 10;
	function cong(a, b) {
		return a + b;
	}
	var c = cong(a,b);
	console.log(c);
</script>

Kết quả:

15

Trường hợp 2:

<script type="text/javascript">
	var a = 5;
	var b = 10;
	function cong(a, b) {
		c = a + b;
		console.log('Hello World!');
	}
	cong(a,b);
	console.log(c);
</script>

Kết quả:

Hello World!
15
  • Sau 2 trường hợp kể trên, các bạn thấy rằng trong trường hợp 1 chúng ta có thể dùng hàm “cong()” với 2 đối số là “a” và “b”. Và hàm này đơn giản là khi ta dùng hàm này và truyền các đối số vào tương ứng cho hàm “cong()” thì nó sẽ thực hiện phép cộng mà ta đã viết bên trong nó. Sau đó, để có thể lưu lại giá trị mà chúng ta đã cộng thì chúng ta cần dùng 1 biến khác bên ngoài hàm “cong()” và nó sẽ lưu lại giá trị từ hàm “cong()” của chúng ta trả về khi chúng ta dùng từ khóa “return”.
  • Với trường hợp 2, hàm “cong()” vẫn thực hiện việc cộng như trên và dùng biến “c” là biến toàn cục để lưu lại giá trị khi chúng ta sử dụng hàm “cong()”, sau đó chúng ta đơn giản chỉ hiển thị một chuỗi “Hello World!” ra ngoài màn hình. Như vậy các bạn thấy, rõ ràng chúng ta không cần giá trị trả về với hàm này. Vì chúng ta đã lưu giá trị cộng vào biến “c” toàn cục và chúng ta còn có thể hiển thị một chuỗi nào đó hoặc hành động bất kì mà không cần thiết phải có giá trị trả về.

Câu hỏi: Khi nào thì chúng ta nên dùng hàm trả về? Và khi nào dùng hàm không trả về?

Trả lời:

  • Tùy mục đích sử dụng của lập trình viên mà chúng ta sẽ quyết định nên viết hàm như thế nào. Ví dụ chúng ta muốn lập trình ra một hàm và nó có mục đích rõ ràng ví dụ như “cộng, trừ, nhân, chia” hay các mục đích xử lý dữ liệu được chỉ định rõ ràng nào khác thì lúc đó chúng ta cần giá trị trả về.
  • Còn khi chúng ta muốn viết một hàm có khả năng thực hiện nhiều công việc bên trong nó, giống như việc bạn lên lịch để thực hiện công việc trong ngày được gói gọn trong một cuốn sổ tay và khi bạn thực hiện có phải bạn sẽ làm theo thứ tự từng việc được sắp xếp sẵn trong ngày cho đến hết đúng không nào.
  • Vì thế hãy suy nghĩ thật kĩ khi viết để tránh các trường hợp viết quá nhiều hàm nhưng chức năng không rõ ràng sẽ gây bất lợi cho bạn trong việc sử dụng lại chính thư viện của mình sau này.

Trong bài học sau, chúng ta sẽ cùng tìm hiểu về Anonymous Function và Closure. Đây là 2 khái niệm rất phổ biến trong thời buổi công nghệ hiện nay, giúp cho việc lập trình của chúng ta nhanh chóng, hiệu quả và dễ hiểu hơn rất là nhiều.

Bài 4: Biểu thức trong Javascript

Biểu thức trong Javascript

Ở bài trước chúng ta đã học qua Toán tử trong Javascript, chắc hẳn các bạn cũng đang rất hứng thú khi tìm hiểu về cách sử dụng toán tử so sánh và logic rồi ? Trong bài này, chúng ta sẽ cùng nhau tìm hiểu về các biểu thức trong Javascript được sử dụng như thế nào nhé.

Biểu thức “If…Else”

Được dùng để so sánh các điều kiện, nếu thoả sẽ thực hiện công việc nào đó. Nếu sai và được lập trình viên định nghĩa thì nó cũng sẽ thực thi công việc nào đó mà lập trình viên mong muốn.

Cú pháp

<script type="text/javascript">
	if (Điều kiện 1) {
		//Nếu điều kiện 1 thoả thì thực hiện
	} else if (Điều kiện n) {
		//Nếu điều kiện n thoả thì thực hiện
	} else {
		//Nếu tất cả điều kiều trên đều sai thì thực hiện
	}
</script>

Với điều kiện “Else if” không cần phải có trong biểu thức “If…Else” nếu như các bạn không có nhu cầu kiểm tra thêm các điều kiện khác trước khi “Else” được gọi vì các điều kiện sai hoàn toàn. Và “Else” cũng không cần thiết nếu như các bạn chỉ cần điều kiện “If” hoạt động.

Ví dụ

(Vui lòng bật F12 trên Chrome/Firefox và chuyển sang Tab Console để thấy kết quả)

<script type="text/javascript">
	var a = 5;
	var b = 10;
	//Trường hợp 1
	if (a < b) {
		console.log('Thoả điều kiện a < b');
	}

	//Trường hợp 2
	if (a > b) {
		console.log('Thoả điều kiện a > b');
	}

	//Trường hợp 3
	if (a > b) {
		console.log('Thoả điều kiện a > b');
	} else {
		console.log('Không thoả điều kiện a > b');
	}

	//Trường hợp 4
	if (a > b) {
		console.log('Thoả điều kiện a > b');
	} else if (a < b) {
		console.log('Không thoả điều kiện a > b nhưng thoả a < b');
	} else {
		console.log('Các điều kiện trên không thoả');
	}
</script>

Kết quả:

Thoả điều kiện a < b
Không thoả điều kiện a > b
Không thoả điều kiện a > b nhưng thoả a < b
  • Sau khi thực nghiệm ví dụ trên, ta thấy cách sử dụng trường hợp 1 và 2 chỉ chạy khi nào thoả điều kiện và trong đó trường hợp 2 đã không được chạy vì đã không thoả điều kiện. Trường hợp 3, do điều kiện đầu không thoả lập tức nó sẽ chạy “Else”. Còn với trường hợp 4, chúng ta xét thêm 1 điều kiện nữa bổ sung cho điều kiện đầu nếu điều kiện đó sai và nó đã thoả điều kiện thứ 2 và chạy. Và trường hợp cuối là nếu như các điều kiện đầu và bổ sung đều sai thì sẽ chạy ngày “Else” như trường hợp 3.

Lưu ý: “Else if” được phép định nghĩa nhiều lần trong “if…else”. Cú pháp như sau:

<script type="text/javascript">
	if (Điều kiện 1) {
		//Thoả điều kiện 1
	} else if (Điều kiện 2) {
		//Thoả điều kiện 2
	} else if (Điều kiện n) {
		//Thoả điều kiện n
	} ...else {
		//Không hoả điều kiện
	}
</script>

Biểu thức “switch…case”

Được dùng trong trường hợp các điều kiện đều so sánh “=” và nếu thoả sẽ thực hiện các công việc trong đó.

Cú pháp

<script type="text/javascript">
	switch (Giá trị cần so sánh) {
		case 'Điều kiện 1':
			break;
		case 'Điều kiện 2':
			break;
		...
		case 'Điều kiện n':
			break;
		default:
			break;
	}	
</script>
  • Cú pháp trên sẽ rất lạ nếu như người học chưa từng lập trình qua ngôn ngữ lập trình nào. Khi sử dụng “switch…case” thì khi thoả điều kiện, chúng ta cần đến từ khoá “break” để ngừng công việc so sánh lại khi đã thực hiện xong công việc trên, nếu không vô tình nó sẽ chạy luôn công việc của điều kiện bên dưới nếu còn và nó sẽ bỏ qua kiểm tra là có thoả điều kiện hay không. Và từ khoá “default” được dùng trong trường hợp các điều kiện bên trên không thoả điều kiện nào.

Ví dụ

Trường hợp 1:

<script type="text/javascript">
	var a = 2;
	switch (a) {
		case 1:
			console.log('Thoả điều kiện a == 1');
			break;
		case 2:
			console.log('Thoả điều kiện a == 2');
			break;
		case "Hello":
			console.log('Thoả điều kiện a == "Hello"');
			break;
		default:
			console.log('Không thoả điều kiện nào');
			break;
	}	
</script>

Kết quả:

Thoả điều kiện a == 2
  • Trong trường hợp đầu tiên, chúng ta thấy rằng “switch…case” cũng giống như việc chúng ta sử dụng “if (a == 2)” nhưng trong “switch…case” thì là “case 2”. Rất đơn giản đúng không nào?

Trường hợp 2:

<script type="text/javascript">
	var a = "Hello";
	switch (a) {
		case 1:
			console.log('Thoả điều kiện a == 1');
			break;
		case 2:
			console.log('Thoả điều kiện a == 2');
			break;
		case "Hello":
			console.log('Thoả điều kiện a == "Hello"');			
		case "World":
			console.log('Thoả điều kiện a == "World"');
		default:
			console.log('Không thoả điều kiện nào');
			break;
	}	
</script>

Kết quả:

Thoả điều kiện a == "Hello"
Thoả điều kiện a == "World"
Không thoả điều kiện nào
  • Như vậy, khi thử nghiệm trường hợp 2. Các bạn đã thấy được sự nguy hiểm khi không dùng đến từ khoá “break” trong “switch…case” chưa nào. Nó sẽ bỏ qua tất cả các điều kiện sau khi thoả điều kiện đầu và sẽ không dừng lại cho đến khi nó gặp từ khoá “break” hoặc “switch…case” đó không còn điều kiện nào nữa cả.

Trường hợp 3:

<script type="text/javascript">
	var a = "999";
	switch (a) {
		case 1:
			console.log('Thoả điều kiện a == 1');
			break;
		case 2:
			console.log('Thoả điều kiện a == 2');
			break;
		case "Hello":
			console.log('Thoả điều kiện a == "Hello"');			
		case "World":
			console.log('Thoả điều kiện a == "World"');
		default:
			console.log('Không thoả điều kiện nào');
			break;
	}	
</script>

Kết quả:

Không thoả điều kiện nào
  • Trong trường hợp cuối cùng và cũng là trường hợp dễ dàng nhất khi các bạn đã hiểu qua “if…else” rồi thì trong “switch…case” nó cũng tương tự như vậy mà thôi.

Kết thúc bài học này, các bạn đã hiểu rõ được cách sử dụng biểu thức trong javascript rồi, có đúng không nào? Thật dễ dàng như việc chúng ta đang hỏi một đứa bé là “Một có lớn hơn hai không?(If 1 > 2) Nếu không thì làm sao cho nó lớn hơn? (Else)”. Ở bài học sau, chúng ta sẽ được tìm hiểu đến với “Hàm trong Javascript” hay “Chương trình con trong Javascript“.

Bài 3: Toán tử trong Javascript

Ở các bài học trước, chúng ta đã tìm hiểu về Kiểu dữ liệuPhạm vi hoạt động của biến trong Javascript. Tiếp nối bài học này, các bạn sẽ được biết qua về Toán tử trong Javascript được quy ước như thế nào?

Toán tử trong Javascript

 

Toán tử trong Javascript

 

Toán tử số học

(Vui lòng bật F12 trên Chrome/Firefox và chuyển sang Tab Console để thấy kết quả)

<script type="text/javascript">
	var a = 10;
	var b = 15;
	var c = 20;
	var d = c - b * a / 2;
	console.log(d);
</script>

Kết quả:

-55
  • Toán tử trong Javascript đều có sự tương đồng với các ngôn ngữ lập trình khác và vẫn tuân theo quy tắc toán học “Nhân chia trước, cộng trừ sau”.

Các bạn có thể xem chi tiết các toán tử của Javascript như sau:

+ Phép cộng
Phép trừ
* Phép nhân
/ Phép chia
% Phép chia lấy dư

Toán tử kết hợp

Toán tử kết hợp Ví dụ viết tắt Ví dụ đầy đủ
++ a++ a = a + 1
a– a = a – 1
+= a += 2 a = a + 2
-= a -= 2 a = a – 2
*= a *= 2 a = a * 2
/= a /= 2 a = a / 2
%= a %= 2 a = a % 2

Toán tử nối chuỗi (String)

<script type="text/javascript">
	var a = "Hello";
	var b = "World!";
	var c = a + " " + b;
	console.log();
</script>

Kết quả:

Hello World!
  • Sau khi thực hiện dòng lệnh như trên, bạn sẽ thấy cách nối chuỗi trong Javascript được thực hiện như thế nào. Thông qua việc sử dụng toán tử “+” để nối 2 chuỗi lại với nhau. Ở ví dụ bên trên còn cho chúng ta thấy được việc chúng ta không nhất thiết phải lưu trữ trong biến mới có thể nối chuỗi được mà chúng đã có thể viết chuỗi trực tiếp trong Javascript.

Trường hợp ngoại lệ

<script type="text/javascript">
	var a = "Hello" + 5;
	var b = "100" + 5;
	var c = 5 + 10 + "Hello";
	var d = 5 + "Hello" + 10;
	var e = "Hello" + 5 + 10;
	console.log(a);
	console.log(b);
	console.log(c);
	console.log(d);
	console.log(e);
</script>

Kết quả:

Hello5
1005
15Hello
5Hello10
Hello510
  • Qua 5 ví dụ đơn giản như trên, nếu như chúng ta sử dụng toán tử “+” theo thứ tự “Chuỗi + Số” thì số cũng sẽ được xem là chuỗi và nó sẽ thực hiện thao tác nối chuỗi như bình thường. Tuy nhiên ở ví dụ biến “c” chúng ta sẽ thấy được độ ưu tiên khi sử dụng toán tử là từ trái sang phải, nếu bên trái toán tử “+” và phải của toán tử “+” đều là số thì nó sẽ thực hiện phép tính trước và sau đó dùng toán tử “+” để nối chuỗi với chuỗi phía sau nó. Tương tự các ví dụ còn lại, các bạn hãy tự viết lại để nhìn nhận ra vấn đề rõ ràng hơn.

Toán tử so sánh

> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
== Bằng
!= Không bằng
=== Bằng và giống kiểu dữ liệu
!=== Không bằng và không giống kiểu dữ liệu

Toán tử Logic

Toán tử Logic True (Đúng) False (Sai)
&& Cả 2 vế trái và phải đúng 1 trong 2 vế trai hoặc phải sai
|| 1 trong 2 vế trái hoặc phải đúng Cả 2 vế trái và phải sai
! Phủ định của False Phủ định của True

Trong bài này, “Toán tử so sánh” và “Toán tử Logic” các bạn nên tham khảo qua. Trong bài Biểu thức trong Javascript, tôi sẽ nói tiếp về các biểu thức “If…Else”, “Switch…case”. Lúc đó các bạn sẽ dần hiểu rõ nó hơn.

Bài 2: Phạm vi hoạt động của biến trong Javascript

Phạm vi hoạt động của biến trong Javascript

Phạm vi hoạt động của biến trong Javascript

Ở bài Tìm hiểu kiểu dữ liệu trong Javascript chúng ta đã được biết qua cách để khai báo và sử dụng Javascript rồi. Trong đó, chúng ta cũng tìm hiểu sơ lược về các kiểu dữ liệu phổ biến bên trong Javascript cũng như đại đa số các ngôn ngữ lập trình khác đều có. Thì trong bài học này, chúng ta sẽ tìm hiểu về phạm vi hoạt động của biến.

Continue reading Bài 2: Phạm vi hoạt động của biến trong Javascript

Bài 1: Tìm hiểu kiểu dữ liệu trong Javascript

Giới thiệu và tìm hiểu kiểu dữ liệu trong Javascript

Giới thiệu và tìm hiểu kiểu dữ liệu trong Javascript

  • JavaScript, theo phiên bản hiện hành, là một ngôn ngữ lập trình kịch bản dựa trên đối tượng được phát triển từ các ý niệm nguyên mẫu. Ngôn ngữ này được dùng rộng rãi cho các trang web, nhưng cũng được dùng để tạo khả năng viết script sử dụng các đối tượng nằm sẵn trong các ứng dụng. Nó vốn được phát triển bởi Brendan Eich tại Hãng truyền thông Netscape với cái tên đầu tiên Mocha, rồi sau đó đổi tên thành LiveScript, và cuối cùng thành JavaScript. Giống Java, JavaScript có cú pháp tương tự C, nhưng nó gần với Self hơn Java. .js là phần mở rộng thường được dùng cho tập tin mã nguồn JavaScript.
  • Phiên bản mới nhất của JavaScript là phiên bản 1.5, tương ứng với ECMA-262 bản 3. ECMAScript là phiên bản chuẩn hóa của JavaScript. Trình duyệt Mozilla phiên bản 1.8 beta 1 có hỗ trợ không đầy đủ cho E4X – phần mở rộng cho JavaScript hỗ trợ làm việc với XML, được chuẩn hóa trong ECMA-357.

(Theo Wikipedia)

Cách khai báo Javascript

Javascript có thể thực thi thông qua cách viết sau trong HTML:

<script type=”text/javascript”>
	//Đoạn code cần thực thi
	alert(“Hello World!”);
</script>

Đoạn code trên sẽ hiển thị thông báo với dòng chữ “Hello World!” đã được định nghĩa.

Ngoài ra, Javascript còn được thực thi những dòng lệnh thông qua cách triệu gọi file Javascript được viết trước đó và lưu vào một file riêng với định dạng “.js”. Và cách gọi file Javascript sẽ được viết như sau:

<script type="text/javascript" src="http://www.TenWebsite.com/ThuMucChuaFile/TenFile.js"></script>

Câu hỏi: Vậy khi nào thì ta sử dụng cách viết trực tiếp trong HTML, khi nào thì ta nên viết trong file?

Trả lời: Khi cần thực hiện những công việc có quy mô và thời gian thực hiện ngắn thì chúng ta có thể viết trực tiếp trong HTML, nhưng ngược lại thì ta nên viết trong file và lưu lại như vậy sẽ tối ưu hơn.

Biến

Biến được dùng để lưu lại dữ liệu vào bộ nhớ nhằm xử lý một tác vụ nào đó. Và trong Javascript, biến có thể chứa nhiều kiểu dữ liệu khác nhau.

Cú pháp:

(Vui lòng bật F12 trên Chrome/Firefox và chuyển sang Tab Console để thấy kết quả)

<script type="text/javascript">
	var a = 'Hello World!';
	console.log(a);
</script>

Kết quả:

Hello World!

Định nghĩa một biến bằng từ khoá “var” và “tênBiến” và sau đó chúng ta có phép gán là “=” để gán giá trị cho biến vừa đặt.

  • Lưu ý thứ 1: javascript cho phép đặt tên biến không cần từ khoá “var”. Tuy nhiên, phạm vi hoạt động của tên biến sẽ không giống nhau.
  • Lưu ý thứ 2: “console.log()” được sử dụng trong các trình duyệt hiện đại sau này (Chrome, Firefox, Opera). Và được xuất ra trong Console chứ không phải trên màn hình trình duyệt.

Kiểu dữ liệu

Kiểu dữ liệu trong Javascript rất đa dạng, vì thế nó cũng ít nhiều gây khó khăn với những người mới khi bước chân sâu vào Javascript.

Kiểu Số:

<script type="text/javascript">
	var a = 5 + 10;
	console.log(a);
</script>

Kết quả:

15

Kiểu chuỗi:

<script type="text/javascript">
	var a = "Hello World!";
	console.log(a);
</script>

Kết quả:

Hello World!

Kiểu Mảng:

<script type="text/javascript">
	var a = [5, "Hello World!", 10];
	console.log('a[0]: ' + a[0]);
	console.log('a[1]: ' + a[1]);
	console.log('a[2]: ' + a[2]);
</script>

Kết quả:

a[0]: 5
a[1]: Hello World!
a[2]: 10

Kiểu đối tượng:

<script type="text/javascript">
	var giay = {
		color: 'red',
		size: 38,
		quantity: 2
	};
	console.log('Color: ' + giay.color);
	console.log('Size: ' + giay.size);
	console.log('Quantity: ' + giay.quantity);
</script>

Kết quả:

Color: red
Size: 38
Quantity: 2

Sau khi xem qua các kiểu dữ liệu cơ bản, chắc hẳn cũng khiến các bạn đôi phần thích thú về cách sử dụng giá trị bên trong Javascript rồi đúng không nào? Khá giống với cách sử dụng của PHP khi không cần phải định nghĩa chính xác kiểu biến được sử dụng (Integer, Float, Double…) như thế nào. Thay vào đó, chúng ta hoàn toàn có thể gán cho nó bất kể giá trị nào, kể cả một array, object hay thậm chí là function (Vấn đề này sẽ nói ở các bài học sau).

Trong bài sau, chúng ta sẽ đọc tiếp tới bài Phạm vi hoạt động của biến để có thể hiểu rõ hơn về cách sử dụng biến trong Javascript.