函数参数的JavaScript执行上下文

时间:2012-07-02 16:39:41

标签: javascript

function Apple(){
    this.name="apple";
}
function Orange(){
    this.name="orange";

    this.apple = new Apple();
    this.apple.onCalled=function(){
        alert(this.name);
    }
}
Orange.prototype.onCalled=function(){
    this.apple.onCalled();
}
var orange = new Orange();
orange.onCalled();

目前代码显示“apple”。如何修改“this.apple.onCalled = function()”行以使其显示“orange”?

即。我想将一个函数传递给另一个对象,但是当调用该函数时,访问传递函数的对象的变量,而不是正在执行该函数的对象的变量。一个显而易见的解决方案是使用全局变量(例如orange.name),但我正在寻找更好的方法,因为有很多对象,我不想全局化。

3 个答案:

答案 0 :(得分:4)

使用闭包。

function Orange(){
    this.name="orange";

    this.apple = new Apple();
    var that = this;
    this.apple.onCalled=function() {
        alert(that.name);
    }
}

阅读关键字this如何在JS中运行,这有点棘手但易于掌握。

答案 1 :(得分:1)

你可以写:

Orange.prototype.onCalled=function(){
    this.apple.onCalled.call(this);
}

很难给出一般答案。要理解的是this绑定在任何函数调用上。这可以使用callapply函数或.运算符在访问函数作为对象属性时明确控制。

科斯给出的关于使用封闭的答案也可能是相关的;这取决于你想要的效果。

答案 2 :(得分:1)

Orange.prototype.onCalled=function(){
    this.apple.onCalled.call(this);
}

示例:http://jsfiddle.net/XrtZe/

查看:Scope in JavaScript