Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript by David Herman

Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript by David Herman

Author:David Herman
Language: eng
Format: epub, pdf
Publisher: Addison-Wesley Professional
Published: 2013-03-25T16:00:00+00:00


var reader = new CSVReader();

reader.read("a,b,c\nd,e,f\n"); // [["a,b,c"], ["d,e,f"]]

This seemingly simple code has a major but subtle bug: The callback passed to lines.map refers to this, expecting to extract the regexp property of the CSVReader object. But map binds its callback’s receiver to the lines array, which has no such property. The result: this.regexp produces undefined, and the call to line.split goes haywire.

This bug is the result of the fact that this is bound in a different way from variables. As Items 18 and 25 explain, every function has an implicit binding of this, whose value is determined when the function is called. With a lexically scoped variable, you can always tell where it receives its binding by looking for an explicitly named binding occurrence of the name: for example, in a var declaration list or as a function parameter. By contrast, this is implicitly bound by the nearest enclosing function. So the binding of this in CSVReader.prototype.read is different from the binding of this in the callback function passed to lines.map.

Luckily, similar to the forEach example in Item 25, we can take advantage of the fact that the map method of arrays takes an optional second argument to use as a this-binding for the callback. So in this case, the easiest fix is to forward the outer binding of this to the callback by way of the second map argument:

Click here to view code image

CSVReader.prototype.read = function(str) {

var lines = str.trim().split(/\n/);

return lines.map(function(line) {

return line.split(this.regexp);

}, this); // forward outer this-binding to callback

};



Download



Copyright Disclaimer:
This site does not store any files on its server. We only index and link to content provided by other sites. Please contact the content providers to delete copyright contents if any and email us, we'll remove relevant links or contents immediately.