- vừa được xem lúc

[JavaScript] JavaScript có gì thú vị?

0 0 13

Người đăng: SonNH

Theo Viblo Asia

Chào mọi người, vào một ngày đẹp trời mình được đứa "em" nhờ giải thích vài bài code "thiếu nhi" mình chợt nhận ra JavaScript-ngôn ngữ yêu thích của mình thật đẹp nhưng cũng thật "khó tính" đến nhường nào. Nào cùng mình tìm hiểu qua một số ví dụ cụ thể thôi!

1. Closure

function a(x) { x++; return function () { console.log(++x); };
} a(1)();
a(1)();
a(1)(); let x = a(1);
x();
x();
x(); 

Đoạn code này nhắc chúng ta về Closure trong JS. Closure cho phép chúng ta tạo một stateful function và hàm như vậy có thể truy cập vào biến bên ngoài phạm vi của nó. Tóm lại, Closure có thể có quyền truy cập vào biến toàn cục (phạm vi), phạm vi hàm cha và phạm vi riêng của nó. Chúng ta có kết quả là 3, 3, 3 , 3, 4, 5bởi vì đầu tiên chúng ta chỉ đơn giản gọi hàm a(). Nó hoạt động giống như một chức năng bình thường và chúng ta không thấy stateful ở đây. Trong trường hợp sau, chúng ta khai báo một biến x và nó lưu giá trị của hàm a (1), đó là lý do tại sao chúng ta nhận được 3, 4, 5 thay vì 3, 3, 3.

2. var, let, const

var tip = 100; (function () { console.log("I have $" + husband()); function wife() { return tip * 2; } function husband() { return wife() / 2; } var tip = 10;
})();

Kết quả: I have $NaN

Chúng ta có thể nghĩ rằng tip = 100 vì nó là một biến toàn cục khi khai báo với từ khóa var. Tuy nhiên, giá trị thực sự của nó là undefined vì chúng ta cũng có var tip = 10 bên trong hàm hàm.

Điểm khác biệt giữa var với let, const đó chính là tính hoisting. Khi dùng từ khoá var để khai báo 1 biến thì biến đó sẽ được kéo lên trên cùng trong phạm vi của nó. Do vậy biến tip lúc này sẽ có giá trị là undefined. Khi thực hiện các phép toán với 1 biến không phải là number đương nhiên ta sẽ nhận được giá trị là NaN rồi.

Nếu không có dòng var tip = 10 thì kết quả là gì nhỉ? Chắc chắn ta sẽ có I have $100. Thế còn dùng const tip = 10 hoặc let tip = 10 thì sao? Khi đó ta sẽ nhận được lỗi to đùng ReferenceError: Cannot access 'tip' before initialization ?

3. Object

let x = {};
let y = {};
let z = x; console.log(x == y);
console.log(x === y);
console.log(x == z);
console.log(x === z);

Kết quả: false false true true

Ta thấy xy đều có giá trị là các object rỗng, vậy tại sao x lại không bẵng y? Nguyên nhân của việc này là array hay object trong JavaScript là kiểu dữ liệu tham chiếu. Khi bạn khai báo một biến là object thì biến đó không lưu giá trị của object đó là sẽ lưu lại địa chỉ ô nhớ chứa thông tin về object mà bạn đã khởi tạo kia. Vì vậy let x = {} được hiểu nôn na là bạn khởi tạo một object có giá trị là {}, object này giả dụ được lưu ở ô nhớ *001. Do đó x sẽ có giá trị là *001. Tương tự đối với let y = {}. Vì vậy x==y hay x===y sẽ ra kết quả là false.

Còn với let z = x thì sao? Dòng lệnh này sẽ gán giá trị của biến x (lúc này là *001) cho biến z. Do đó x==z hay x===z sẽ ra kết quả là true.

Lời kết:

JavaScript là một ngôn ngữ rất dễ học vì cú pháp khá linh hoạt không đòi hỏi tính chặt chẽ cao. Đi cùng với điều đó cũng khiến những người mới học rất dễ gặp một số lỗi logic nếu như không nắm vững kiến thức cơ bản. Hy vọng qua 3 ví dụ đơn giản trên các bạn có thêm một số kiến thức giúp bản thân không gặp những con bug "xinh xắn" mà không hiểu sao chúng lại xuất hiện. Hẹn gặp lại các bạn trong các bài viết sau. Nếu có góp ý xin vui lòng để lại dưới bình luận để mình có thể sửa chữa trong các bài viết sau. Cảm ơn mọi người vì đã đọc!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 528

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 436

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 158

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 149

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 113

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 249