Note: Every question is followed by Output and a rough Explanation. Scroll at your own risk.
Q1.
var msg = "hello";
if (true) {
var msg = "welcome";
}
console.log(msg);
// ----
let msg2 = "hello";
if (true) {
let msg2 = "welcome";
}
console.log(msg2);
Output
welcome
hello
Explanation
var
is function scoped, therefore, when msg
is declared inside the if
block, it overrides the msg
in the global scope. This does not happen with let
as it is block scoped.
Q2.
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
Output
5
5
5
5
5
Explanation
Since var
is function scoped the i
variable holds the value 5
after the loop ends. The callback function in the setTimeout
gets the same value for every occurrence.
Solution
- Convert
var
tolet
to create a scope for every iteration.
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
- Wrap the
setTimeout
in an anonymous function. Passingi
as a parameter scopes it to the anonymous function and therefore the value is not lost.
for (var i = 0; i < 5; i++) {
(function (x) {
setTimeout(function () {
console.log(x);
}, 1000);
})(i);
}
Q3.
const obj = {
["foo_" + (() => 1)()]: "Hello",
};
console.log(obj);
Output
{ foo_1: 'Hello' }
Q4.
console.log([1,2,3] + [4,5,6]);
Output
1,2,34,5,6
Explanation
String([1,2,3]);
is "1,2,3"
Hence, "1,2,3" + "4,5,6"
is "1,2,34,5,6"
Q5. What's the order of execution?
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
Output
1
4
3
2
Explanation
Priority for event loop is: call stack > microtask > macrotask
All the synchronous code is executed first
Therefore, logs 1
, 4
Next, there is a Promise
and a setTimeout
Promise callback is stored in microtask queue
& setTimeout callback is stored in macrotask queue
microtask
has a higher priority over macrotask
. Therefore, it logs 3
followed by 2
Q6.
console.log(typeof typeof 1);
Output
string
Explanation
Evaluate from Right to Left
-
typeof 1
return number -
typeof 'number'
returns string
Q7.
console.log(Math.max() < Math.min());
Solution
true
Explanation
The default value for Math.max()
is -Infinity
& default value for Math.min()
is Infinity
Hence, -Infinity < Infinity
is true
Q8.
function func() {
return foo;
foo = 1;
function foo() {}
var foo = "hello";
}
console.log(typeof func());
Output
function
Explanation
Due to one round of parsing (hoisting) the code looks like this
function func() {
var foo; // hoisted
function foo() {} // hoisted
return foo;
foo = 1;
foo = "hello";
}
console.log(typeof func());
Because of that, the last value available for foo is function
Q9.
console.log(3 > 2 > 1);
Output
false
Explanation
It starts from left to right
so 3 > 2
equals true
true > 1
is equivalent to 1 > 1
which is false
Q10.
function fn() {
return this.str;
}
var str = "global";
var obj = {
str: "obj",
};
console.log(fn(), fn.call(obj));
Output
global obj
Explanation
When executing fn()
the value of this
is window
and window.str
is global
.
.call()
assigns this
to obj
and obj.str
is obj
Note: This solution works in non-strict
mode.
Thanks for reading 💙
Follow @codedrops.tech for daily posts.
Instagram ● Twitter ● Facebook
Micro-Learning ● Web Development ● Javascript ● MERN stack ● Javascript
codedrops.tech
Top comments (7)
In the second example,
The callback functions are asynchronous. Therefore, when the
for
loop has finished, the variablei
has a value5
. And when the callback function starts to execute, at that moment it prints the value which is5
.Hey, can you please explain no 2 more? Why will it be all 5
Let's first understand how the loop works.
At the end of the loop i = 5 (not 4). The loop repeated 5 times (i = 0,1,2,3,4).
When setTimeout starts to execute the function it uses the global "i", which is 5, and executes it 5 times hence you see "5" five times.
UPD: replaced "let" by "var". Copied from the wrong place. There are no issues with "let".
👍👍👍👍👍👍
Hy! Can anyone please explain 2 more!?
Answered in comments
dev.to/olvnikon/comment/18875
thank's