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()");
当然,你会写第一个,因为:
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的条件。