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

San*_*Lee 7 javascript firefox google-chrome google-chrome-devtools firefox-developer-tools

当我尝试进入copy内部时,Chrome会抱怨setTimeout.

setTimeout(function () { copy('a') }, 0)

Uncaught ReferenceError: copy is not defined
    at <anonymous>:1:26
Run Code Online (Sandbox Code Playgroud)

它也不适用于window范围.

setTimeout(function () { window.copy('a') }, 0)

Uncaught TypeError: window.copy is not a function
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我保留引用copy并重用它,它就可以工作

cc = copy;
setTimeout(function () { cc('a') }, 0);
Run Code Online (Sandbox Code Playgroud)

在Firefox中,它不会抛出任何错误,但即使使用保存的引用它也不起作用.

为什么copy功能不起作用setTimeout,这是一个错误吗?

jdu*_*ing 6

通过提启发with这个答案,我发现,你可以用它来copy()提供setTimeout(),而不必创建一个全局引用它和其他回调:

with ({ copy }) { setTimeout(() => copy("copied!"), 0) }
Run Code Online (Sandbox Code Playgroud)

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


JJJ*_*JJJ 5

copy是开发人员工具的命令行API的一部分,在浏览器控制台外部不可用。例如,尝试在普通网页的JavaScript文件中执行命令,您将得到相同的错误。

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