如何将实例函数传递给外部函数?

时间:2014-08-13 19:06:34

标签: javascript

让我说我在名为file1.js的文件中有以下内容:

//constructor
function Blah(){

    this.string = "hello there agent ";

}

//'method'
Blah.prototype.greeting = function(num){
    return  this.string + num;
}

然后在一个名为file2.js的文件中,我有了这个:

function combine(num,funct){
    return funct(num);
}

然后最后,在一个名为file3的html文件中,我有这个:

var bond = new Blah();
document.write(combine(007,bond.greeting));

我实际上正在进入"问候"方法,但由于某种原因,返回值,而不是一个字符串,结束不是NaN。知道为什么吗? greeting()方法似乎在适当的时候运行。然而,尽管如此,007似乎被解释为NaN无论如何。再次,任何关于可能导致这种情况的建议?

提前感谢一堆

4 个答案:

答案 0 :(得分:2)

首先,根据您调用greeting方法的方式,this值会有所不同。如果您将其称为bond.greeting(num),则this将为bond。如果您将其称为funct(num),其中functbond.greeting,则this将成为全局对象。在传递函数时,您需要永久绑定this,无论您如何调用函数,都要保持其值。

其次,007 === 7。如果你想从字面上打印007,那么你应该使用一个字符串:

combine('007', bond.greeting.bind(bond));

请记住,this取决于函数如何被调用,它是动态的,并且解析了运行时,除非你先前绑定它,就像我们上面那样。

答案 1 :(得分:1)

您遇到了this关键字的特殊特征。

基本上,this会解析为您调用函数的任何内容。在您的情况下,您通过func()从全局范围调用它,从而生成this == window。 (通过bond.greeting()调用this == bond。)

要解决此问题,请bind函数或强制解析:

// note that this method requires a shim for IE 8 and older
document.write(combine(007,bond.greeting.bind(bond)));

function combine(num, obj, funct){
    // since funct is being called from obj, `this` == obj within the function
    return obj[funct](num);
}

document.write(combine(007,bond, 'greeting'));    

答案 2 :(得分:0)

1)NaN是“非数字”错误。尝试将007封装在引号中 2)你需要file2.js还是没有它?

var bond = new Blah();
document.write(bond.greeting("007"));

答案 3 :(得分:0)

你遇到的问题是当你将函数作为参数传递时,它会按值传递,然后你松开对具有元素string = "hello there agent ";的对象的引用,并且当函数执行时,它会执行{ {1}}在函数内部不存在,它返回"this.string"。这是一个范围问题。

使其运行良好的解决方案是传递作为对象undefined

的引用
bond