Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么人们使用setTimeout(";func()";,…)而不是setTimeout(func,…)_Javascript - Fatal编程技术网

Javascript 为什么人们使用setTimeout(";func()";,…)而不是setTimeout(func,…)

Javascript 为什么人们使用setTimeout(";func()";,…)而不是setTimeout(func,…),javascript,Javascript,我看到这使用了很多,有人告诉我把函数引用放在引号之间是不好的,因为setTimeout/setIntervalevals引用。这两种方法之间的实际区别是什么,一种方法比另一种方法使用得多,为什么我看到这种方法如此频繁地使用,尽管大家都知道这种方法不好 人们可能没有意识到他们可以使用无引号的形式 字符串中引用的名称可能尚未定义 引用的表格会延迟执行: setTimeout("myFunction(1, 'hello')", 100) 比以下内容更容易理解: setTimeout(function

我看到这使用了很多,有人告诉我把函数引用放在引号之间是不好的,因为
setTimeout
/
setInterval
evals
引用。这两种方法之间的实际区别是什么,一种方法比另一种方法使用得多,为什么我看到这种方法如此频繁地使用,尽管大家都知道这种方法不好

  • 人们可能没有意识到他们可以使用无引号的形式

  • 字符串中引用的名称可能尚未定义

  • 引用的表格会延迟执行:

    setTimeout("myFunction(1, 'hello')", 100)
    
    比以下内容更容易理解:

    setTimeout(function () { myFunction(1, 'hello') }, 100)
    
    这并不是作者想要的:

    setTimeout(myFunction(1, 'hello'), 100)
    

  • 我打赌它还可以防止内存泄漏

    不泄漏X:

    var x = $("loading");
    setTimeout("createTree(1);", 0);
    
    泄漏的X:

    var x = $("loading");
    setTimeout(function(){createTree(1);}, 0);
    

    这两种形式之间有两个主要区别:

    setTimeout("myFunc()", 100);
    

    第一种方法效率较低,它在全局范围内对函数求值,因此不能向其传递局部函数或任何非全局函数

    看看效率参数,如果您想调用代码中的函数,您会写:

    x = myFunc();
    
    x = eval("myFunc()");
    
    或者你会写:

    x = myFunc();
    
    x = eval("myFunc()");
    
    当然,你会写第一个,因为:

  • 这就是通常编写javascript的方式
  • 函数引用可以在解释器的第一个过程中解析一次,而不是每次执行时解析一次
  • 迷你化器/优化器可以使用第一个(而不是第二个)重命名符号
  • 可以使用第一个函数调用局部函数,但第二个函数需要全局函数
  • eval()

  • 仅供参考,表示
    eval()
    版本速度慢96%。在某些情况下,性能可能并不重要,但您可以了解它的效率有多低。

    因为人们都是哑巴。政治上更正确,因为普遍使用并不意味着最佳实践。。。使用一段基于其自身内在优点的代码,而不是因为它是“普通”或“酷”的东西。最后一段代码确实有效。它只是没有达到一些人可能期望的效果。你的意思是它没有引起错误。它没有达到作者的意图。如上所述。鉴于你是本案的作者,我无法反驳这一点。我的观点是,您可能需要
    myFunction
    返回函数或可求值字符串。我认为最好将#2表述为“每次在全局上下文中求值表达式”,因为它可能不包含名称或标识符,而包含解析为可调用内容的表达式。对于#3,引用的表达式不会给出“延迟执行”,而是每次(在全局上下文中)对表达式进行重新计算。您是否有这方面的来源?@Dennis不太可能,但可能@你能解释一下内存泄漏是如何发生的吗?或者发布一个实际的例子?或者为什么要使用jQuery?这毫无意义。
    setTimeout()
    应该对
    x
    的行为没有影响。我是从setTimeout的行为推断出来的。例如,
    function runme(){var x=1;setTimeout(“警报(x);”,1000)}function runme2(){var x=1;setTimeout(function(){alert(x);},1000)}
    调用
    runme()
    将抛出错误,因为x超出范围,符合GC的条件。调用
    runme2()
    将向x发出警报,因为它在作用域中,在1秒之后才符合GC的条件。