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