调用不带括号的函数时如何传递参数[Javascript]

Posted

技术标签:

【中文标题】调用不带括号的函数时如何传递参数[Javascript]【英文标题】:How to pass parameters when calling a function without the parenthesis [Javascript] 【发布时间】:2011-11-02 19:51:37 【问题描述】:

我有一个名为“tryMe”的函数,我在不带括号的情况下调用它并不完全是这样,但这个想法就像你在这里要做的那样:

setTimeout(tryMe,200);

如何传递我需要的参数?

我正在使用一个 jquery 插件,它使我能够调用一个函数,但我必须在没有括号的情况下调用它,否则它会在加载时自行执行。

【问题讨论】:

它执行是因为函数被评估并且函数的结果被传递给setTimeout;函数本身没有按预期传递。 将您正在做的事情描述为“调用不带括号的函数”是不准确的。您在问题中发布的语句中未调用该函数。相反,您函数的 引用 被传递给另一个函数 (setTimeout),它会在某个时间(实际上是 200 毫秒后)调用您的函数 with 括号(概念上)。不过,您在这里问的是一个非常常见的混淆点,答案并不明显。 @Pointy 感谢您向我解释 =) 【参考方案1】:
setTimeout(function()  tryMe(parm1, parm2); , 200);

更强大的产品,以确保parm1parm2 的值在超时触发之前不会改变(根据@lincolnk 的评论):

setTimeout(function() 
   var p1 = parm1;
   var p2 = parm2;
   tryMe(p1, p2);
, 200);

@patrick dw,你是对的,必须先评估。

【讨论】:

只要确保在超时触发之前您没有更改参数值。 您的更新不会与原始版本有任何不同。为了确保调用 setTimeout 时存在的值,您需要 invoke 一个函数,在 that 函数中本地引用它们,并拥有该函数返回一个引用本地定义的引用的函数。 更优雅的方式是使用setTimeout(tryMe.bind(window,parm1,parm2),200);。 IE8 或更低版本不支持 bind(),但可以用等效的 javascript 实现。【参考方案2】:

您可以将tryMe 包装在一个闭包中。

例如:

var f = function()tryMe('some parameter');;
setTimeout(f, 200);

在这里,我们创建一个函数对象f,它使用所需的参数调用tryMe。然后我们将f 传递给setTimeout。当超时到期时,f 将被调用,而tryMe 又将调用所需的参数。

如果您希望在调用超时之前传入可能会更改的参数(例如,如果您在 for 循环中设置多个超时),请注意:您需要像这样绑定这些变量:

var f = function(someParamter)return function()tryMe(someParameter);;;
setTimeout(f(someParameter), 200);

原因只是做了类似的事情

setTimeout(tryMe('some parameter'), 200); //Does not work.

不起作用是因为您传递的是评估 tryMe 的结果,而不是函数对象 tryMe 本身。

【讨论】:

【参考方案3】:

您没有调用该函数,浏览器调用了 - 200 毫秒后。您只是为它提供需要调用的函数。 Firefox 实际上允许在 setTimeout 调用中指定附加参数:

setTimeout(tryMe, 200, "first parameter", "second parameter");

但是,据我所知,没有其他浏览器支持此功能,因此您应该真正使用闭包函数,正如其他答案所解释的那样。在这里,您创建一个临时函数,其唯一目的是使用正确的参数调用您的原始函数。

setTimeout(function() tryMe("first parameter", "second parameter"), 200);

【讨论】:

以上是关于调用不带括号的函数时如何传递参数[Javascript]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中怎么不带括号的调用函数

Matlab调用不带括号的函数

js中new创建对象时带括号和不带括号有啥区别

当我们调用函数时,如果没有像func这样的参数传递,则需要参数括号();与函数(); [关闭]

如何打印不带括号的字符串数组,以便可以在函数参数中使用

JavaScript 函数调用时带括号和不带括号的区别