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

时间:2012-07-11 15:12:17

标签: javascript

我试图通过JS将诸如http://mysite.com/#32132之类的已经传递给自定义函数。

这是功能:

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秒后,我在控制台中出现错误:

  

未捕获的ReferenceError:32132未定义

我尝试过不同的方式来调用downloadVideo。带引号,没有引号,没有加号。似乎没什么用。如果我在setTimeout之前立即调试hash.log,它会正确显示它。

4 个答案:

答案 0 :(得分:2)

如果只有数字字符......

,则需要将其表示为字符串
     // ------------------v--------v
setTimeout('downloadVideo("'+hash+'")', 3000);

但最好传递一个关闭hash ...

的函数
setTimeout(function() { downloadVideo(hash) }, 3000);

答案 1 :(得分:0)

您可以使用闭包来执行此操作:

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

答案 2 :(得分:0)

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

2)超时时最好使用匿名功能;评估的字符串很好地进行了评估。通常是一个坏主意。

3)错误即将发生,因为你传递的字符串没有引号。修复点2以使用匿名函数会使此错误更明显,更难以提交

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

反正:

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

答案 3 :(得分:0)

假设hash的值为test则为:

'downloadVideo('+hash+')'

...评估为:

downloadVideo(test)

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

将函数传递给setTimeout要好得多。 它更安全,更易于阅读,并且不会遇到您在此处看到的问题。如果不需要参数,只需按名称引用该函数:

setTimeout(downloadVideo, 3000)

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

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