In the Apple “classs”, how can the nested function countSeeds() retrieve the value this.price?
jsfiddle: http://jsfiddle.net/VGqEa/
Apple = function() {
this.price = 17
this.cutOpen = function() {
console.log(this.price);
countSeeds();
function countSeeds() {
console.log(this.price);
}
}
}
var apple = new Apple();
apple.cutOpen();
Output
17 undefined
Advertisement
Answer
put var self = this at the top of Apple, and then refer to this as self instead in the nested function.
i.e.:
Apple = function() {
var self = this;
this.price = 17
this.cutOpen = function() {
console.log(this.price);
countSeeds();
function countSeeds() {
console.log(self.price);
}
}
}
var apple = new Apple();
apple.cutOpen();
You could also put the self=this statement at the beginning of this.cutOpen, since this will still refer to the Apple object in cutOpen (since it is a method of Apple).
Update
Most evergreen browsers now support arrow functions, so you can write it like:
Apple = function() {
this.price = 17
this.cutOpen = function() {
console.log(this.price);
let countSeeds = () => {
console.log(this.price);
};
countSeeds();
}
}
This doesn’t work in IE11 or other older browsers, unless you use some kind of transpiler to target older javascript.