Đoạn code sau sẽ cho kết quả:
bar();
var bar;
function bar() {
console.log('first');
}
bar = function () {
console.log('second');
};
bar();
foo();
function foo() {
console.log(1);
}
var foo = function () {
console.log(2);
};
function foo() {
console.log(3);
}
foo();
bar();
var bar;
function bar() {
console.log('first');
}
bar = function () {
console.log('second');
};
bar();
foo();
function foo() {
console.log(1);
}
var foo = function () {
console.log(2);
};
function foo() {
console.log(3);
}
foo();
Trả lời:
Đáp án đúng: B
Đoạn code trên minh họa hoisting trong JavaScript.
1. **`bar();` (dòng 1):** Hàm `bar` được gọi trước khi nó được khai báo tường minh (bằng `function bar() {}`). Do hoisting, khai báo hàm `bar` được đưa lên đầu phạm vi, nên `bar()` ở đây sẽ gọi hàm `bar` ban đầu, in ra 'first'.
2. **`var bar;` (dòng 2):** Dòng này chỉ khai báo biến `bar`, nhưng vì hàm `bar` đã được hoisting nên không ảnh hưởng.
3. **`bar = function () { ... };` (dòng 6-8):** Gán một *biểu thức hàm* (function expression) cho biến `bar`. Từ thời điểm này trở đi, `bar` không còn là hàm ban đầu nữa.
4. **`bar();` (dòng 9):** Gọi `bar` sau khi nó đã được gán biểu thức hàm, in ra 'second'.
5. **`foo();` (dòng 10):** Tương tự `bar`, hàm `foo` được gọi trước khi biểu thức hàm được gán cho `foo`. Do hoisting, lời gọi này sẽ thực thi một trong các khai báo hàm `foo` được đưa lên trên. Vì khai báo hàm `foo` cuối cùng sẽ ghi đè các khai báo trước đó, lời gọi này in ra 3.
6. **`var foo = function () { ... };` (dòng 15-17):** Gán một *biểu thức hàm* cho biến `foo`, ghi đè khai báo hàm `foo` được hoisting trước đó.
7. **`foo();` (dòng 19):** Gọi `foo` sau khi nó đã được gán biểu thức hàm, in ra 2.
Vì vậy, kết quả là: first second 3 2.
Tổng hợp 500 câu hỏi trắc nghiệm Javascript có đáp án đầy đủ nhằm giúp các bạn dễ dàng ôn tập lại toàn bộ các kiến thức.
50 câu hỏi 60 phút