调用不带括号的函数时如何传递参数[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);
更强大的产品,以确保parm1
、parm2
的值在超时触发之前不会改变(根据@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]的主要内容,如果未能解决你的问题,请参考以下文章