javascript - 加上javascript中带引号的运算符

标签 javascript

最近我看到一个函数,其中参数用加号运算符和引号括起来,如下所示:

function foo(elemId, a, interval) {
   // Some logic here;
   // Basically some animation logic


   // Recursive
   var repeat = "foo('"+elemId+"',  '"+a+"', '"+interval+"')";    

   setTimeout(repeat, interval);

}

这里的elemId是字符串类型,ainterval可以是任意的(假设取整数)。

用引号将加号运算符两边括起来的目的是什么?

编辑:我知道如果字符串是这样的字符串,那么在字符串之前的单个加号运算符会将其转换为数字 "33" 否则为 NaN。但是在这种情况下,一定不能将其转换为数字,因为这里的elemId只是元素的id。

编辑 2:为什么我们不能像这样直接将函数传递给 setTimeout: setTimeout(foo, interval);

最佳答案

该代码正在构建一段将由 setTimeout 进行eval 的 JavaScript。 JS 包含一个函数调用,传递给它的参数需要是字符串文字(即带引号)以避免它们被视为标识符(即变量)。

但这不是好的做法。如果任何数据包含引号,它就会中断,并且传递要评估的字符串效率低下(并且可以在范围内做意想不到的事情)。

代码应该写成:

setTimeout(function () { foo(elementId, a, interval); }, interval);

即传递一个调用 foo 的函数,其中的变量被作用域捕获。

... 或使用三参数形式(Internet Explorer 不支持):

setTimeout(foo, interval, [elementId, a, interval]);

关于javascript - 加上javascript中带引号的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124552/

相关文章:

用户控件内的 JavaScript 不运行

javascript - 如何跳线?

javascript - Chart.js 忽略 Canvas 高度和宽度

javascript - a.nodeName.toLowerCase 不是函数

javascript - 如何在 AngularJS 中更改另一个下拉列表时更新多个下拉值

javascript - IFrame站点的访问URL

javascript - 如何清理(销毁)Twitter Bootstrap 3.2 模式表单内容

javascript - 从 javascript 向 php 发送日期时间时管理夏令时

javascript - 获取html中当前光标类型(如果之前没有通过css设置光标,则默认为[auto]!)

javascript - 为什么我确实需要 angular2 中的 detectorChanges ?