SetTimeout -为什么传递函数比传递字符串更好
SetTimeout - why is passing a function better then a string?
我用
setTimeout('InitData()', 100);
但是JSHint告诉我"使用函数比使用字符串更好",我把它改成:
setTimeout(function () { InitData() }, 100);
为什么会这样呢?
原因如下:
-
首先,当您向
示例(请参阅控制台中的错误)setTimeout
传递字符串时,该字符串将在全局上下文中求值。这意味着它调用的函数必须是一个全局函数。避免全局变量是个好习惯。(function() { "use strict"; setTimeout("display('hi');", 0); function display(msg) { var p = document.createElement('p'); p.innerHTML = String(msg); document.body.appendChild(p); } })();
…因为
display
不是一个全局函数。但这是有效的:
(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); } })();
-
使用函数引用而不是字符串意味着我们使用相同的语义我们使用回调,而不是使调用
setTimeout
一些奇怪的特殊的事情。例如,当事件发生时,我给addEventListener
一个函数调用的方式与我给setTimeout
一个函数在超时时调用的方式是相同的。一致的语义有助于避免错误。 -
使用函数引用而不是字符串可以让我非常具体地知道我调用的是什么函数。考虑:
function showInASecond(str) { setTimeout(function() { alert(str); }, 1000); }
我不能合理地使用字符串。哦,我可以尝试创建一个连接,确保转义我必须在
str
中转义的所有内容(如引号,反斜杠等),但简单更好。 -
如果你传递给
setTimeout
一个字符串,它必须启动一个完整的JavaScript解析器来计算它。没有太大的问题,但仍然比需要做更多的工作。
相关文章:
- 有没有更好的动手、具体的方法来学习Javascript
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 在JavaScript中拆分日期字符串的更好方法是什么
- 用Javascript重新格式化复杂文本日期字符串的更好方法
- 为什么 +str 在 JS 中比 str*1 更好地将字符串转换为数字
- 使用coffeescript/jQuery生成HTML比使用字符串更好
- 有没有更好的方法可以根据数组的名称检查字符串
- 哪种方式在Javascript,字符串连接或数组中更好
- 在 String.prototype.rereplace 使用的字符串中转义美元符号的更好方法
- 为什么将 JSON 对象存储在 cookie 中比字符串更安全或更好
- 在角度 2 中,是否有更好的方法通过两组引号以外的输入传递字符串
- 在字符串原型方法之后,after_Last,之前和before_Last之后实现(在javascript中)的更好方法
- 两个字符串的特殊连接的更好方法
- 计算某些字符串值的更好方法
- Regex从URL中提取匹配的字符串(有效,更好的解决方案?)
- 有没有比insertAdjacentHTML()和一个巨大的HTML字符串更好的方法将HTML插入DOM中
- SetTimeout -为什么传递函数比传递字符串更好
- 性能方面,算法复杂性方面,下面两个JS函数中哪一个用于将字符串的第一个字母大写更好,为什么?
- JS找到更好的字符串匹配
- 是否有更好的JavaScript代码来验证字符串为Date-Time