最近我看到一个函数,其中参数用加号运算符和引号括起来,如下所示:
function foo(elemId, a, interval) {
// Some logic here;
// Basically some animation logic
// Recursive
var repeat = "foo('"+elemId+"', '"+a+"', '"+interval+"')";
setTimeout(repeat, interval);
}
这里的elemId是字符串类型,a
和interval
可以是任意的(假设取整数)。
用引号将加号运算符两边括起来的目的是什么?
编辑:我知道如果字符串是这样的字符串,那么在字符串之前的单个加号运算符会将其转换为数字 "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/