将哈希从URL传递到具有延迟的函数

Pass Hash from URL to a Function with Delay

本文关键字:延迟 函数 哈希 URL      更新时间:2023-09-26

我正试图传递一个has,例如http://mysite.com/#32132通过JS到自定义函数。

功能如下:

var downloadVideo = function(passed){
  console.log(passed);
}

以下是我如何从URL获取和传递哈希:

if(window.location.hash){
    var hash = window.location.hash;
    hash = hash.substring(1, hash.length); // Remove the # from the hash
    setTimeout('downloadVideo('+hash+')', 3000)
}

3秒钟后,我在控制台上收到一个错误:

未捕获引用错误:未定义32132

我试过用不同的方式呼叫downloadVideo。有引号,没有引号,没有加号。似乎什么都不管用。如果我在setTimeout之前立即console.log散列变量,它会正确显示它。

如果有超过数字字符的内容,则需要将其表示为字符串。。。

     // ------------------v--------v
setTimeout('downloadVideo("'+hash+'")', 3000);

但最好传递一个在hash上闭合的函数。。。

setTimeout(function() { downloadVideo(hash) }, 3000);

您可以使用闭包来实现这一点:

setTimeout(function() {
  downloadVideo(hash);
}, 3000);

1)您不需要has子字符串中的第二个参数-如果省略,子字符串将匹配字符串的末尾

2) 对于超时,最好使用匿名函数;经过求值的字符串是经过求值的。一般来说是个坏主意。

3) 错误的出现是因为您传递的是一个没有引号的字符串。修复点2以使用匿名函数将使此错误更明显,也更难首先提交

4) 你可以总是在函数中应用超时,而不是在对它的调用中

总之:

setTimeout(function() { downloadVideo(hash); }, 3000);

假设hash的值为test,则:

'downloadVideo('+hash+')'

评估为:

downloadVideo(test)

请注意,字符串test周围没有引号,因此它被视为引用了一个变量(不存在)。这是不将字符串传递给setTimeout的众多原因之一。正如这里所描述的,这是一种糟糕的做法:

  • https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/eval#Don%27t_use_eval

将函数传递给setTimeout要好得多它更安全,更容易阅读,而且不会受到你在这里看到的问题的影响当不需要参数时,只需按名称引用函数即可:

setTimeout(downloadVideo, 3000)

如果需要参数,就像您的情况一样,那么您需要传递对匿名函数的引用,并让该函数调用您想要调用的函数:

setTimeout(function() {
    downloadVideo(hash);
}, 3000)