为什么复制功能在setTimeout中不起作用?

时间:2018-02-28 11:42:56

标签: javascript google-chrome firefox google-chrome-devtools firefox-developer-tools

当我在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内不起作用,这是一个错误吗?

2 个答案:

答案 0 :(得分:4)

copy是开发人员工具“Command Line API的一部分,在浏览器控制台之外无法使用。例如,尝试在普通网页的JavaScript文件中执行命令时会出现同样的错误。

当您在setTimeout回调中调用命令时,执行上下文不再是控制台,因此copy不再存在。

答案 1 :(得分:1)

this answer中提到with的启发,我发现您可以使用它在copy()和其他回调中使setTimeout()可用,而不必创建全局引用:

with ({ copy }) { setTimeout(() => copy("copied!"), 0) }

copied!现在将在剪贴板上。不幸的是,这个技巧似乎在Firefox的控制台中不起作用。