1

最近我看到一个函数,其中的参数被加号运算符和引号包围,如下所示:

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);

4

3 回答 3

5

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

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

代码应该写成:

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

即传递一个函数,该函数foo使用范围捕获的变量进行调用。

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

setTimeout(foo, interval, [elementId, a, interval]);
于 2013-08-08T11:15:57.293 回答
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."
于 2013-08-08T11:19:07.290 回答
-1

像这样阅读它(空格会更容易):

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

setTimeout期望函数名作为字符串文字。该函数的参数被内联附加。整个函数调用将作为字符串文字传递给setTimeout.

setTimeout("foo('elem', '1', '2')", 2) 

其中 elemId = elem, a = 1 和 interval = 2

于 2013-08-08T11:16:23.013 回答