javascriptgoogle-chromefirefoxgoogle-chrome-devtoolsfirefox-developer-tools

Why copy function is not working inside setTimeout?


Chrome complains when I try to copy inside setTimeout.

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

Uncaught ReferenceError: copy is not defined
    at <anonymous>:1:26

It doesn't work with the window scope as well.

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

Uncaught TypeError: window.copy is not a function

Interestingly, if I keep the reference to copy and reuse it, it works

cc = copy;
setTimeout(function () { cc('a') }, 0);

In Firefox, it doesn't throw any error, but it doesn't work even with the saved reference.

Why copy function doesn't work inside setTimeout, is it a bug?


Solution

  • copy is part of the developer tools' Dev Tools Utilities API and is not available outside the browser console. For example, trying to execute the command in a JavaScript file that's part of a normal web page you'd get the same error.

    When you invoke the command inside the setTimeout callback, the execution context is no longer the console so copy doesn't exist anymore.