Skip to content

Instantly share code, notes, and snippets.

@cowboy
Last active May 12, 2020 11:56
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cowboy/5860393 to your computer and use it in GitHub Desktop.
Save cowboy/5860393 to your computer and use it in GitHub Desktop.
A JavaScript "eval is evil" narrative by way of the "pass a string to setTimeout" anti-pattern...
// An object with a property and a method.
var obj = {
name: "Ben",
logName: function() {
console.log(this.name);
}
};
// And another global variable, for good measure.
var name = "Whoops";
// Even though this works great...
obj.logName(); // logs "Ben"
// This doesn't, because of how JavaScript determines the "this" value...
setTimeout(obj.logName, 1000); // logs "Whoops" in one second.
// Someone who doesn't really understand JavaScript might fall back on eval...
setTimeout("obj.logName();", 1000); // logs "Ben" in one second.
// When they should instead be either doing this...
setTimeout(function() {
obj.logName();
}, 1000); // logs "Ben" in one second.
// Or, in environments that support ES5, this.
setTimeout(obj.logName.bind(obj), 1000); // logs "Ben" in one second.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment