代码之家  ›  专栏  ›  技术社区  ›  Sanghyun Lee

为什么复制函数在setTimeout内不工作?

  •  8
  • Sanghyun Lee  · 技术社区  · 6 年前

    当我试图 copy 在…内 setTimeout .

    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
    

    有趣的是 复制 然后再利用它,它就工作了

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

    在Firefox中,它不会引发任何错误,但即使保存了引用,它也无法工作。

    为什么? 复制 函数在内部不起作用 设置超时 ,是虫子吗?

    2 回复  |  直到 6 年前
        1
  •  7
  •   JJJ Sergey    6 年前

    copy 是开发人员工具的一部分 Command Line API 并且在浏览器控制台之外不可用。例如,尝试在作为普通网页一部分的JavaScript文件中执行该命令时,会出现相同的错误。

    setTimeout 回调时,执行上下文不再是控制台,因此 复制 已经不存在了。

        2
  •  6
  •   jdunning    6 年前

    灵感来源于提及 with 在里面 this answer ,我发现你可以用它 copy() 在中可用 setTimeout() 和其他回调,而不必创建对它的全局引用:

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

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