当我尝试在copy
中使用setTimeout
时,Chrome会抱怨。
setTimeout(function () { copy('a') }, 0)
Uncaught ReferenceError: copy is not defined
at <anonymous>:1:26
它也不适用于window
范围。
setTimeout(function () { window.copy('a') }, 0)
Uncaught TypeError: window.copy is not a function
有趣的是,如果我保留对copy
的引用并重用它,它就有效
cc = copy;
setTimeout(function () { cc('a') }, 0);
在Firefox中,它不会抛出任何错误,但即使使用保存的引用它也不起作用。
为什么copy
函数在setTimeout
中不起作用,它是一个bug吗?
copy
是开发人员工具'Command Line API的一部分,在浏览器控制台之外不可用。例如,尝试在JavaScript文件中执行该命令,该文件是普通网页的一部分,您将收到相同的错误。
当您在setTimeout
回调中调用命令时,执行上下文不再是控制台,因此copy
不再存在。
受到在with
中提及this answer的启发,我发现你可以使用它在copy()
和其他回调中提供setTimeout()
,而不必创建它的全局引用:
with ({ copy }) { setTimeout(() => copy("copied!"), 0) }
copied!
现在将在你的剪贴板上。不幸的是,这个技巧似乎在Firefox的控制台中不起作用。