I'm trying to use a callback method addToCount
instead of anonymous function in forEach
. But I can't access this.count
in it (returns undefined
).
function Words(sentence) { this.sentence = sentence; this.count = {}; this.countWords(); } Words.prototype = { countWords: function() { var words = this.sentence.split(/\W+/); words.forEach(this.addToCount); }, addToCount: function(word) { word = word.toLowerCase(); if (word == '') return; if (word in this.count) this.count[word] += 1; else this.count[word] = 1; } }
I think the problem is the scope. How can I pass this
to addToCount
or is there any other way to make it work?
You need to use Function#bind
to bind a scope:
words.forEach(this.addToCount.bind(this));
Note that this is not available in all browsers: you should use a shim (as provided in the link above) to add it in the browsers that don't support Function#bind
.
As dandavis points out in the comments, you can pass a value to Array#forEach
as the context for the callback:
words.forEach(this.addToCount, this);
Try something like this. I've used that
rather than _this
but also I've moved addToCount
so it's inside countWords
. That turns countWords
into a closure containing that.
Words.prototype = { countWords: function() { var that = this, words = this.sentence.split(/\W+/); words.forEach(function(word) { word = word.toLowerCase(); if (word == '') return; if (word in that.count) that.count[word] += 1; else that.count[word] = 1; }); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With