Hi,
Ở trong javascript, nếu bạn chạy trên môi trường nodejs thì global object là global còn trên trình duyệt là object window.
Khi bạn khai báo var a = 'Global'
thì a sẽ ở module wrapper.
(function(exports, require, module, __filename, __dirname) {
// It keeps top-level variables (defined with var, const or let)
// scoped to the module rather than the global object.
});
Nên khi bạn gọi hàm whatsThis()
ở global thì tức là bạn đang chạy whatsThis.call(this)
, this
ở đây lại là một object không cùng context với module wrapper function.vì vậy a
và this.a
trong function whatsThis
không cùng 1 context nên this.a
sẽ return undefined
. ( Mình đoán vậy )
...
var a = 'Global';
...
whatsThis(); // hay whatsThis.call(this) -> a === 'undefined'
Nhưng nếu bạn chạy trên google dev tool trên trình duyệt. Lúc này biến khai báo và từ khóa this
nằm cùng 1 context nên kết quả sẽ trả về đúng a === 'Global'
Bạn có thể log trên console của window để xem các biến Javascript engine xử lý như thế nào.
Quay trở lại console của linux. Bắt đầu thử xem các biến được nodejs sắp xếp như thế nào
Khi nhấn enter
và bạn tìm xuống cuối object được log ra màn hình. Bạn vấn thấy kết quả ra đúng Global
và các biến được khai báo nằm trong context này.
Nhưng khi bạn viết trong file. và chạy bằng lệnh node tenfile.js
Kết quả sẽ ra như thế này:
Là do ở browser thì scope to nhất là global
. Nhưng trong nodejs, khi bạn sử dụng file hay module thì các biến, hàm khai báo chỉ nằm trong module đó. sử dụng context của module đó. Các biến này thì private trong module.
Cơ chế của nodejs khá phức tạp. bạn có thể đọc document của nodejs để tìm hiểu thêm. Nếu bạn muốn đưa các biến khai báo ra scope to nhất. bạn có thể sử dụng luôn biến đó mà không cần khai báo bằng từ khóa var
a = 'Global'; // Not recommend!!!
var obj = { a: 'Custom' };
function whatsThis(arg) {
console.info(this);
return this.a;
}
whatsThis();
Khi đó kết quả sẽ là :
Còn khi bạn chạy hàm whatsThis()
nhưng được call bởi 1 Object khác. Thì biến this trong function sẽ trỏ đến object này.
...
var a = 'Global';
var obj = { a: 'Custom' };
function whatsThis(arg) {
// Khi hàm này được call bởi 1 object khác.
// Lúc này this trong context của function này sẽ trỏ đến obj đó.
console.log(this); // -> { a: 'Custom' }
return this.a; // === 'Custom'
}
whatsThis.call(obj);
...
Nói chung là biến this
trong javascript khá phức tạp. Bạn nên làm quen dần. =))) Đúng là phải mất mấy năm mới hiểu được phần nào của JS.
welcome to Js world! =)))