There are some fun hoisting quiz here, and I will keep adding more. Not only focusing the result, but also trying to understand why. Here's article may help you understand Execution Context
and Hoisting
.
Q1
console.log('1')
console.log(teddy)
var teddy = 'bear'
function sing() {console.log('ohhh la la')}
======= result =======
1
undefined
Q2
console.log('1')
console.log(teddy)
console.log(sing())
var teddy = 'bear'
function sing() {console.log('ohhh la la')}
======= result =======
1
undefined
ohhh la la // as function declaration are hoisted
undefined // ignore, as there's 2 console.log()
Q3
console.log('1')
console.log(teddy)
console.log(sing())
var teddy = 'bear'
(function sing() {console.log('ohhh la la')})
======= result =======
1
undefined
ReferenceError: sing is not defined // as it see bracket then fn, JavaScript engine doesn't hoist it.
Q4
console.log('1')
console.log(teddy)
let teddy = 'bear' // change it to let or const
======= result =======
1
ReferenceError: teddy is not defined // keyword let | const do not hoist
Q5
console.log(sing())
console.log(sing2)
// function expression
var sing2 = function() {console.log('uhhh la la')}
// function declaration
function sing() {console.log('ohhh la la')}
console.log(sing2())
======= result =======
ohhh la la
undefined //as it see var, so sing2 is undefined
uhhh la la
Q6
console.log(sing())
console.log(sing2())
// function expression
var sing2 = function() {console.log('uhhh la la')}
// function declaration
function sing() {console.log('ohhh la la')}
console.log(sing2())
======= result =======
ohhh la la
undefined //as it see var, so sing2 is undefined
TypeError: sing2 is not a function // sing2 is undefined
Q7
var one = 1 // hoisting it to undefined
var one = 2 // ignore it, as one have already hoisted
console.log(one)
======= result =======
2
Q8
console.log(a)
console.log(a())
a()
function a() {console.log('hi')}
======= result =======
ƒ a() {console.log('hi')}
hi
undefined
hi
Q9
a()
function a() {console.log('hi')}
a()
function a() {console.log('bye')}
a()
======= result =======
bye // same as var, rewrite content
bye
bye
Q10
var favouriteFood = 'grapes'
var foodThoughts = function () {
console.log('Original favourite food: ' + favouriteFood)
var favouriteFood = 'sushi'
console.log("new favourite food: " + favouriteFood)
}
foodThoughts()
======= result =======
Original favourite food: undefined
Original favourite food: sushi
Explain
- creating execution context hoisting favouriteFood and foodThoughts, all of them are undefined
- execution phrase, favouriteFood is grapes, foodThoughts is equal to a function, then creating a new execution context for it.
New execution context repeat above in foodThoughts
- creating execution context hoisting favouriteFood is undefined
- execution phrase first is undefined, second is sushi
Q11
var favouriteFood = 'grapes'
var foodThoughts = function () {
console.log('Original favourite food: ' + favouriteFood)
console.log("new favourite food: " + favouriteFood)
}
foodThoughts()
======= result =======
Original favourite food: grapes
Original favourite food: grapes
Top comments (0)