将参数传递给setTimeout函数

3

从函数传递参数到setTimeout调用有什么问题?为什么这里的path返回undefined?应该怎么做呢?

$('.curatorSpace').bind('click', function() {
    var path = $(this).attr('data-path');
    setTimeout(function(path) {
        if($('#curatorRibbon').hasClass('ui-draggable-dragging')){return false}
        runOverlay(path);
    }, 100);
});
1个回答

7

你不需要/必须在那里传递任何东西。path 是一个 自由变量 并被你传递到 setTimeout 中的匿名函数封闭。因此,你可以直接访问它。

setTimeout(function() {
    if($('curatorRibbon').hasClass('ui-draggable-dragging')){return false}
    runOverlay(path);  // path gets resolved in the parent context
}, 100);

实际上,通过将path声明为该匿名函数的形式参数,您已经覆盖了通过作用域链进行的变量查找过程。只需摆脱它。


进一步澄清一下 - 当 setTimeout 调用您提供的函数时,setTimeout 不会向该函数传递参数。 - Stephen P
@StephenP 这通常是正确的。但是,在IE之外的浏览器中,延迟(这里是100)之后可能会添加其他参数,这些参数将传递给函数。如果您想要为多个超时使用相同的函数,则这可能很方便,但在这里特别没有太大价值。有关详细信息,请访问https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout。 - Jeff Bowman
@Jeff - 是的,谢谢你进一步澄清,也许将来IE会迎头赶上(我还没有检查过IE10)。 - Stephen P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接