在Apple“类”中,嵌套函数countSeeds()
如何检索值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();
输出
17
undefined
答案 0 :(得分:8)
将var self = this
放在Apple的顶部,然后在嵌套函数中将其称为self。
即:
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();
您也可以将self=this
语句放在this.cutOpen的开头,因为这仍然会引用cutOpen中的Apple对象(因为它是Apple的一种方法)。
<强>更新强>
大多数常青浏览器现在支持箭头功能,因此您可以像下面这样编写:
Apple = function() {
var self = this;
this.price = 17
this.cutOpen = function() {
console.log(this.price);
let countSeeds = () => {
console.log(this.price);
};
countSeeds();
}
}
这在IE11或其他旧版浏览器中不起作用,除非您使用某种转换器来定位较旧的JavaScript。
答案 1 :(得分:1)
默认情况下,在不提供上下文的情况下调用函数时,this
引用window
对象。如果您不喜欢默认设置,请尝试call或apply设置上下文:
this.cutOpen = function() {
console.log(this.price);
countSeeds.call(this); //use call to set the context for the function.
function countSeeds() {
console.log(this.price);
}
}
我建议您将countSeeds
移到构造函数外部,以防止多次重新定义:
function countSeeds() {
console.log(this.price);
}
Apple = function() {
this.price = 17
this.cutOpen = function() {
console.log(this.price);
countSeeds.call(this);
}
}
或者将countSeeds
定义为原型的功能:
Apple = function() {
this.price = 17
this.cutOpen = function() {
console.log(this.price);
this.countSeeds(); //use countSeeds as an instance method.
}
}
Apple.prototype.countSeeds = function () {
console.log(this.price);
}
在我看来,countSeeds
在这种情况下应该是一个实例方法,因为 它总是访问 当前实例的price
属性,如果this
为window