console.log(myName); // undefined
console.log(demo); // undefined
show(); //Hello everybody
var myName = "this is name";
function show(){
console.log("Hello everybody");
}
var demo = function () {
console.log("this is function anonymous");
};
console.log(myName); // this is name
demo(); // this is function anonymous
show(); //Hello everybody
Ok mình cảm thấy hoisting đang rất dễ hiểu
console.log(name); // this is name
console.log(demo); // undefined
show(); //Hello everybody
var name = "this is name";
function show(){
console.log("Hello everybody");
}
var demo = function () {
console.log("this is function anonymous");
};
console.log(name); // this is name
demo(); // this is function anonymous
show(); //Hello everybody
Giờ thì mình không hiểu vì sao lại như thế?
Update…
Trong quá trình vừa viết câu hỏi vừa check code để tìm câu trả lời mình đã phát hiện ra 1 điều. Vâng. Nói ra chắc sẽ có bạn nói rằng cảm ơn bạn đã nói những điều ai cũng biết
hoặc đại loại thế, nhưng mình cứ viết ra đây để tự bản thân mình nhớ lâu hơn.
Đại khái là nó thế này, như ở đoạn code đâu tiên thì hoisting
là khá rõ dàng khi mà cosole.log(myName)
thứ nhất sẽ cho ra kết quả là undefined
và console.log(myName)
thứ hai sẽ cho ra kết quả là this is name
.
Còn ở đoạn code tiếp theo thì console.log(name)
thứ hai sẽ cho kết quả là this is name
điều này dễ hiễu rồi, còn console.log(name)
thứ nhất vẫn có kết quả là this is name
thì đúng là hoisting có vấn đề. Bạn nào tìm hiều về hoisting sẽ thấy.
Mình đang học tới hoisting và cảm thấy thật ngu người khi kết quả hiển thị là như vậy. Có xóa đi viết lại vẫn thấy thế cho tới khi mình bỏ hẳn biến var name
mà thay bằng tên khác thì mới phát hiện ra là khi bạn tạo 1 file.js
và thực thi nó trong file.html
thì trình duyệt sẽ luôn khởi tạo trong đối tượng hay con trỏ(mình không biết chính xác nó là gì) this
một key
có tên là name
và có giá trị mặc đinh là ""
một giá trị falsey
(rất tiện khi dùng nó làm codition
). Một khi lỡ đặt tên một biến nào đó có tên là name
và gán giá trị cho nó thì (tất nhiên là đã thực thi code) thì trình duyệt sẽ luôn lưu giữ giá trị đó dành cho key name
của this
dù cho sau đó ta có xóa đoạn code khai báo biến đó thì giá trị mà ta khai báo cho name
luôn tồn tại cho tới khi ra tắt tab trình duyệt đang thực thi đoạn mã js đó.
Liên hệ lại với đoạn code mình post lên định để hỏi thì vì mình đã khai báo var name = "this is name"
. Thế nên là dù mình có xóa đi làm lại hay dựa vào hoisting để suy đoán thì cũng luôn luôn sai
.
Kinh nghiệm rút ra là mình sẽ không đặt tên biến trong js là name
nữa vì vốn dĩ nó đã tồn tại và có value. Còn về hoisting thì ok nếu không có cái name
thì mình đã kết thúc phần tìm hiểu về nó và nhảy qua cái khác rồi chứ đã không post bài này định hỏi ngu nữa.
Mình sẽ post video lên và lưu ý rằng mình chỉ test trên chrome bản mới nhất còn những trình duyệt khác thì mình không biết. Cũng vì đang tập tành học js cho nó theo xu hướng nên bài post này có gì sai mong mọi người góp ý chứ đừng chửi. Còn gì nữa không nhỉ??? Thôi có còn thì cũng post vào replly.
Cảm ơn.