March 15, 2010
Nicholas answered three JavaScript quizzes in his blog. I am not interested in quiz like the one given below
var num1 = 5,
num2 = 10,
result = num1++ + num2;
However some of the questions helped me learn a few things.
Recently there was a quiz out.
This was question #5 in the original blog. I have modified the quiz a little bit to suit my needs.
var x = 10;
var foo = {
x: 20,
bar: function () {
var x = 30;
return this.x;
},
};
// 1
console.log(foo.bar());
// 2
console.log(foo.bar());
// 3
console.log(foo.bar.call());
I got the first two answers wrong. In JavaScript a variable and a property are
two different things. When this.xyx
is invoked then JavaScript engine is
looking for property called xyz
.
var bar = function () {
var x = 30;
return this.x;
};
console.log(bar()); //=> undefined
In the above case output is undefined
. This is because this
refers to a
property named x
and since no such property was found undefined
is the
answer.
var foo = {
x: 20,
bar: function () {
return x;
},
};
console.log(foo.bar());
Above code causes ReferenceError
because x is not defined
. Same theory
applies here. In this case x
is a variable and since no such variable was
found code failed.
Coming back to the third part of the original question. This one uses call.
console.log(foo.bar.call());
First argument of call
or apply
method determines what this
would be
inside the function. If no argument is passed then JavaScript engine assumes
that this
would be global scope which translates to this
being window
.
Hence the answer is 10
in this case.
There was another quiz .
In the original blog this is question #2.
var x = 5,
o = {
x: 10,
doIt: function doIt() {
var x = 20;
setTimeout(function () {
alert(this.x);
}, 10);
},
};
o.doIt();
The key thing to remember here is that
All functions passed into setTimeout() are executed in the global scope
.
In the original blog this is question #5.
var o = {
x: 8,
valueOf: function () {
return this.x + 2;
},
toString: function () {
return this.x.toString();
},
},
result = o < "9";
alert(o);
The thing to remember here is that when comparison is done then valueOf
method
is called on the object.
This is question #1 in the original blog.
if (!("a" in window)) {
var a = 1;
}
alert(a);
I knew that all the variable declarations are hoisted up but somehow failed to apply that logic here. Please see the original blog for a detailed answer.
This is question #5 in the original blog.
function a() {
alert(this);
}
a.call(null);
I knew that if nothing is passed to call
method then this
becomes global but
did not know that if null
is passed then also this
becomes global.
If this blog was helpful, check out our full blog archive.