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
vartoletto create a scope for every iteration.
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
- Wrap the
setTimeoutin an anonymous function. Passingias 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 1return 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
forloop has finished, the variableihas 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