最近我看到一个函数,其中参数包含加号运算符和引号,如下所示:
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);
答案 0 :(得分:5)
代码正构建一段由eval
setTimeout
编写的JavaScript。 JS包含一个函数调用,传递给它的参数需要是字符串文字(即引用),以避免它们被视为标识符(即变量)。
但这不是一个好习惯。如果任何数据包含引号,它将会中断,并且传递要评估的字符串效率低下(并且可以使用范围做出意想不到的事情)。
代码应写为:
setTimeout(function () { foo(elementId, a, interval); }, interval);
即。传递一个函数,该函数使用范围捕获的变量调用foo
。
...或使用三个参数形式(Internet Explorer不支持):
setTimeout(foo, interval, [elementId, a, interval]);
答案 1 :(得分:1)
就像其他人所解释的那样,这里的优点不是作为变量的一部分读取的,它们只是用于连接字符串。原则与以下内容相同:
var name = "ashish2expert";
var some_int = 5;
var concatenation = "This question was asked by " + name + " approximately " + some_int + " minutes ago.";
// Will result in
// "This question was wasked by ashish2expert approximately 5 minutes ago."
答案 2 :(得分:-1)
像这样阅读(空格会让它变得更容易):
var repeat = "foo('" + elemId + "', '" + a + "', '" + interval + "')";
setTimeout
期望函数名称为字符串文字。该函数的参数是内联的。整个函数调用将作为字符串文字传递给setTimeout
。
setTimeout("foo('elem', '1', '2')", 2)
其中elemId = elem,a = 1且interval = 2