1

我创建了以下对象:

function Calculator() { 
    //some code here, including object variables and functions, such as:
    this.add = function(x) {
       //again, irrelevant code
    }
    //similar methods
}


var calc = new Calculator();

然后,我尝试执行以下操作:

var met = calc.add;
met(5);

但它没有用。

(我已经检查了所有内容 - 变量 'met' 的类型为 'function',当我“提醒”它确定时,它会提醒正确的字符串 -function(x){...}等等。但是调用 met(7) 什么都不做,而调用calc.add(7)添加数字)

有谁知道为什么,或者我该如何解决?(我可以修复它吗?)

4

4 回答 4

1

实际上,里面的功能add并不是无关紧要的。您遇到的问题是因为thisjavascript 中的行为方式。

当你这样称呼它时:

met(5);

这和这样做是一样的:

window.met(5); // assuming browsers

这意味着thisin met 绑定到全局对象。所以它不起作用的原因是因为您尝试添加的任何变量都不存在于全局对象中。您可以简单地通过在全局对象中声明该变量来测试它(对于浏览器来说,它恰好是全局变量):

var foo = {
    i = 0,
    incr = function(){ return ++this.i }
}
foo.incr(); // this works as expected

// now assign foo.incr to the global object:
var inc = foo.incr;
inc(); // this fails because window.i doesn't exist

// create i in window
i =0;
inc(); // now this works, maybe a bit unexpected

如果您想简单地别名但仍对对象进行操作,add您有两个选择。首先是确保将其作为以下方法调用:metcalcaddcalc

var met = function(x) { return calc.add(x) };
met(5);

这很简单,并且可以按预期工作。通过添加一个匿名函数包装器,我们可以调用addas calc.add()which make thisbound to calc。

第二个是@Guffa 提到的:使用 call 或 apply 指向this任何你想要的:

var met = calc.add;
met.call(calc,5);

要了解有关thisjavascript 工作原理的更多信息,请阅读以下内容:Javascript 中的“this”关键字如何在对象文字中起作用?

于 2012-11-22T21:14:55.920 回答
0

当您获得对方法的引用时,您只是获得了函数,它不再连接到对象。如果您调用该函数,this则不是对对象的引用,而是全局window对象,这就是函数中的代码不再起作用的原因。

要将其作为方法调用,您需要在调用时指定它应作为对象的方法运行:

met.call(calc, 5);
于 2012-11-22T20:59:28.750 回答
0

有用。你没有你认为你有的问题。

function Calculator() { 
    //some code here, including object variables and functions, such as:
    this.add = function(x) {
       alert('bob');
    }
    //similar methods
}

var met = new Calculator().add;

met();//'bob'

正如其他人所建议的那样,您可能会遇到某种范围问题。met 应该可以访问在 add 方法之上建立的任何 var。

于 2012-11-22T21:08:39.473 回答
0

您必须记住的是,每次调用函数时,它都好像是一个隐藏参数,而不是在您调用函数时设置并保存在函数闭包中的东西。

当您调用 met(5) 时,以下内容将输出到控制台:

function Calculator() {
    y = 10; // set variable

    this.add = function(x) {
       console.log( this.y ); // => undefined as window object does not have y
       console.log( y ); // => 10 as function can access parent function's closure

       function printY( ) {
            console.log( y ); // => undefined as this function can only access parent function's closure and that does not contain a y variable.
       }
    }
}
于 2012-11-22T21:16:35.353 回答