Javascript SetTimeout-为什么传递函数比传递字符串更好?

Javascript SetTimeout-为什么传递函数比传递字符串更好?,javascript,Javascript,我曾经 但是JSHint告诉我“使用函数比使用字符串更好”,我把它改为: setTimeout('InitData()', 100); 但为什么会这样呢?有几个原因 主要是,当您传递setTimeout字符串时,该字符串将在全局上下文中进行计算。这意味着它调用的函数必须是全局函数。避免全球化是一种很好的做法 例如,此操作失败:(请参阅控制台中的错误) …因为display不是全局函数 但这是可行的: 使用函数引用而不是字符串意味着我们在使用回调的任何地方都使用相同的语义,而不是让调用setT

我曾经

但是JSHint告诉我“使用函数比使用字符串更好”,我把它改为:

setTimeout('InitData()', 100);

但为什么会这样呢?

有几个原因

  • 主要是,当您传递
    setTimeout
    字符串时,该字符串将在全局上下文中进行计算。这意味着它调用的函数必须是全局函数。避免全球化是一种很好的做法

    例如,此操作失败:(请参阅控制台中的错误)

    …因为
    display
    不是全局函数

    但这是可行的:

  • 使用函数引用而不是字符串意味着我们在使用回调的任何地方都使用相同的语义,而不是让调用
    setTimeout
    成为一些奇怪的特殊事情。例如,当事件发生时,我给
    addEventListener
    一个要调用的函数的方法与给
    setTimeout
    一个超时时要调用的函数的方法相同。一致的语义有助于避免错误

  • 使用函数引用而不是字符串可以让我非常明确地知道调用什么函数。考虑:

    (function() {
      "use strict";
    
      setTimeout(display.bind(null, 'hi'), 0);
      // Or:
      // setTimeout(function() { display('hi'); }, 0);
    
      function display(msg) {
        var p = document.createElement('p');
        p.innerHTML = String(msg);
        document.body.appendChild(p);
      }
    })();
    
    我无法合理地在那里使用字符串。哦,我可以尝试创建一个连接,确保在
    str
    中转义所有我必须转义的内容(如引号、反斜杠等),但simple更好

  • 如果您传递
    setTimeout
    一个字符串,它必须启动一个完整的JavaScript解析器来计算它。这不是什么大问题,但仍需要做更多的工作


  • 参见heer,字符串方法看起来像是对延迟执行的攻击。在JS中,这是不必要的,因为函数是一级公民,可以用作函数参数。当您开始传递参数时,原因就显而易见了。另一个相关问题:
    (function() {
       "use strict";
    
       setTimeout("display('hi');", 0);
    
       function display(msg) {
         var p = document.createElement('p');
         p.innerHTML = String(msg);
         document.body.appendChild(p);
       }
    })();
    
    (function() {
      "use strict";
    
      setTimeout(display.bind(null, 'hi'), 0);
      // Or:
      // setTimeout(function() { display('hi'); }, 0);
    
      function display(msg) {
        var p = document.createElement('p');
        p.innerHTML = String(msg);
        document.body.appendChild(p);
      }
    })();
    
    function showInASecond(str) {
      setTimeout(function() {
        alert(str);
      }, 1000);
    }