2013-09-26 46 views
1

为什么在将函数传递给replace的最后一个参数时,该函数不带括号?为什么函数传递替换不带括号

MDN

function replacer(match, p1, p2, p3, offset, string){ 
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics 
    return [p1, p2, p3].join(' - '); 
}; 
newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer); 

回答

0

这里有一个小的细微差别,可能是很难在第一把握。

如果您要添加圆括号,则表示您希望replacer在此时和之后被调用。这实际上并不是你想要做的。

replace实际上是在寻找一个函数的引用,所以你实际上是在传递函数作为参数到replace。在内部,replace知道何时何地正确调用replacer

2

如果添加了圆括号,则会评估名为replacer的函数表达式。

而是在这里传递一个名为replacer的变量,它是对该函数的引用。如果不是马上执行此功能,那么请在本机调用Javascript的replace时使用它以后的

我有时想到的一个比喻是,你正在交出一把枪给别人开火,你不是自己开火。 replacer()的意思是“立即开枪”,而replacer的意思是“这里,用这个来开火”。这里的期望是,JavaScript的本地功能将用子弹(参数)“加载枪”,然后在准备就绪时触发它。

+0

而不是..? – 1252748

+0

这是相反的,而不是传递一个函数的参考 –

0

因为当你使用带括号的函数名f()时,你需要调用函数并使用结果。当你没有括号使用时,f,如果意味着你正在使用函数本身。如果有帮助,可以考虑使用引用函数的代码,而不是返回的值。

在您的示例中,您没有调用函数替换器并传递值来替换。您正在传递一段代码,称为替换函数replace,以便函数replace在需要时调用它。

0

在JavaSCript中,函数是一个像其他任何对象一样的对象。它可被分配给一个变量,传递给函数,从函数返回等

在这种情况下,以replacer参考被用作可变这里:

newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer); 

函数本身正在传入呼叫replace。 (这将可能执行的是内部函数,至少某些条件下)。如果括号中加入这样的:

newString = "abc12345#$*%".replace(/([^\d]*)(\d*)([^\w]*)/, replacer()); 

然后而不是传递函数本身作为参数,你会传递的结果作为参数的函数。该函数的结果似乎是一个字符串。然而,你调用的函数并不期望一个字符串,它需要一个函数。 (传递一个字符串可能会失败,当它试图“执行”该字符串。)

+1

我认为OP的混淆是替代者期望参数和回调似乎并没有发送它们。只是猜测的原因,我想知道,当我第一次看到这一点。 –

+0

@凯卿:可能。虽然我们没有看到“replacer”被调用的位置,但我们并没有看到它是否接收参数。在这种情况下,我会假设'replace'在内部将它们提供给回调函数。 – David

+0

@KaiQing是的,就是这样。它如何获得这些参数? – 1252748

0

这是一个callback

如果您致电replacer(),那么您将运行replacer function而不带任何参数。

在这种情况下,替换函数要求callback as the second parameter,替换方法将调用给定的可调用参数本身。

认为它这样,你可以做这样的事情之内更换功能:

.replace(/([^\d]*)(\d*)([^\w]*)/, function() { 
    //You can write replacer's code here as a closure 
}); 

而不是定义这样一个封闭的,你告诉替换功能调用替代品的功能。

0

原因是因为replacer是一个函数指针。就像你可以有指向变量实例的指针一样,你可以指向函数指针。如果括号被放置在replacer之后,例如replacer()那么replacer将被评估为函数本身。相反,您正在做的是将指针传递给函数replacer,然后可以使用函数replace调用该函数。

在C++中:这种模式的替代方法的一个常见用法是函数对象/函数指针。其中struct/object将operator()重载以使其像函数一样工作。但是大多数语言都有一个这样的版本,无论它们被称为仿函数,回调,函数指针或其他。

相关问题