Javascript programmers are practically ranked by how well they understand scope. It can at times be quite counter-intuitive.
A globally-scoped variable
Intermediate: No such thing as block scope in JavaScript
A globally-scoped variable
var a = 1;
// global scope
function one() {
alert(a);
}
Local scopevar a = 1;
function two(a) {
alert(a);
}
// local scope again
function three() {
var a = 3;
alert(a);
}
Intermediate: No such thing as block scope in JavaScript
var a = 1;
function four() {
if (true) {
var a = 4;
}
alert(a); // alerts '4', not the global value of '1'
}
Advanced: object propertiesvar a = 1;
function five() {
this.a = 5;
}
Advanced: Closurevar a = 1;
var six = (function() {
var foo = 6;
return function() {
// JavaScript "closure" means I have access to foo in here,
// because it is defined in the function in which I was defined.
alert(foo);
};
})();
Advanced: prototype-based scope resolutionvar a = 1;
function seven() {
this.a = 7;
}
// [object].prototype.property loses to
// [object].property in the lookup chain. For example...
// Won't get reached, because 'a' is set in the constructor above.
seven.prototype.a = -1;
// Will get reached, even though 'b' is NOT set in the constructor.
seven.prototype.b = 8;
Altogheter// These will print 1-8
one();
two(2);
three();
four();
alert(new five().a);
six();
alert(new seven().a);
alert(new seven().b);
Global + local: An extra complex casevar x = 5;
(function () {
console.log(x);
var x = 10;
console.log(x);
})();
This will print out undefined
and 10 rather than 5
and 10.