Yeah, I agree with the other comments -- the greatest JS scoping gotcha involves unbound methods.
var o = { a:13, add:function(b){ return this.a + b; } };
o.add(42); // => `55`
var add = o.add;
add(42); // => `NaN`, because `this.a` is (presumably) `undefined`
var a = 3;
add(42); // => `45`, because `this.a` is resolved to `window.a`, as `window` is the global variable used as the method context when we call an unbound function (which is stupid (`null` would have been a way better choice, Brandon)).
This is the sort of thing you learn and just get over to reach the level of javascript mastery. Yeah, some things are silly. But you know what? You only get to write one language to access the dynamic web.
For unknown reasons, ARC has truncated my code-comment. It read:
// => `45`, because `this.a` is resolved to `window.a`, as `window` is the global variable used as the method context when we call an unbound function (which is stupid (`null` would have been a way better choice, Brandon)).
You might want to consider including something about how passing objects between functions can be by reference or value for object oriented Javascript programming.
JavaScript only supports pass by value, @ author: Nice quiz, I failed the last one, it would be nice to add more quizes and test users knowledge of function scoping, just like the commenter said, since functions can be passed around like objects, function scoping is another tricky one to master for beginners.
veryvery superb quiz! I like the way you mix questions with a tutorial, not just "HA, you suck, wrong", but really give detailed explanations, even when the correct answer is given.
Maybe you can add some questions with strange return values or some "what happens if you modify the passed-in object within a function?";
function(){
var fn2=function(){}
if (fn2()){
alert("nobody ever calls me");
}
else{
alert("stop calling me!");
}
}
(no return value is a falsy value)
var data={a:"cow"};
function update(obj){
obj.a="fish";
}
update(data);
alert(data.a); //"fish"
vs.
var data="cow";
function update(str){
str="fish";
}
update(data);
alert(data); //"cow"
See https://developer.mozilla.org/en-US/docs/JavaScript/Referenc...
> In the global context (outside of any function), this refers to the global object, whether in strict mode or not.