1

我正在尝试通过 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 之前 console.log 立即显示哈希变量,它会正确显示。

4

4 回答 4

2

如果不仅仅是数字字符,则需要将其表示为字符串...

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

但最好传递一个关闭的函数hash......

setTimeout(function() { downloadVideo(hash) }, 3000);
于 2012-07-11T15:15:28.463 回答
0

假设 的hash值为test

'downloadVideo('+hash+')'

...评估为:

downloadVideo(test)

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

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

setTimeout(downloadVideo, 3000)

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

setTimeout(function() {
    downloadVideo(hash);
}, 3000)
于 2012-07-11T15:18:51.977 回答
0

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

2)超时最好使用匿名函数;评估的字符串,嗯,评估。一般是个坏主意。

3)错误来了,因为你传递了一个不带引号的字符串。将第 2 点固定为使用匿名函数将使这个错误更明显且更难首先提交

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

反正:

setTimeout(function() { downloadVideo(hash); }, 3000);
于 2012-07-11T15:16:39.497 回答
0

您可以使用闭包来做到这一点:

setTimeout(function() {
  downloadVideo(hash);
}, 3000);
于 2012-07-11T15:15:18.670 回答