将哈希从URL传递到具有延迟的函数
Pass Hash from URL to a Function with Delay
我正试图传递一个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)
相关文章:
- 如何延迟函数
- 如何在 JS 中调用 2 次或更多次时延迟函数执行
- jQuery/Javascript 延迟函数的执行,直到多个函数完成
- 如何按顺序调用延迟函数
- 使用promise或setTimeout确定延迟函数的调用顺序
- 如何在 QML 中创建延迟函数
- jQuery deferred:用于延迟函数的返回,直到函数内的异步调用完成+获取返回值
- 如何在 AJAX 函数中添加延迟函数
- 节点 js 从客户端和另一个节点模块调用相同的延迟函数
- 如何对延迟函数执行单元测试
- 延迟函数执行(API 调用)以在时间段内执行 n 次
- 延迟函数删除类
- 链接延迟函数
- js,延迟函数
- RxJS 和 React 的 setState - 延迟函数执行直到订阅
- Javascript 延迟函数,但让循环等待它
- 如何延迟函数以使其完全加载
- Javascript延迟函数
- 试图理解延迟函数的语法
- 在流畅的Javascript API中延迟函数的返回