加上带有javascript引号的运算符

时间:2013-08-08 11:13:01

标签: 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);

3 个答案:

答案 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