当我在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
内不起作用,这是一个错误吗?
答案 0 :(得分:4)
copy
是开发人员工具“Command Line API的一部分,在浏览器控制台之外无法使用。例如,尝试在普通网页的JavaScript文件中执行命令时会出现同样的错误。
当您在setTimeout
回调中调用命令时,执行上下文不再是控制台,因此copy
不再存在。
答案 1 :(得分:1)
受this answer中提到with
的启发,我发现您可以使用它在copy()
和其他回调中使setTimeout()
可用,而不必创建全局引用:
with ({ copy }) { setTimeout(() => copy("copied!"), 0) }
copied!
现在将在剪贴板上。不幸的是,这个技巧似乎在Firefox的控制台中不起作用。