大家都知道,第一个参数一般是一个字符串,内容为将要执行的那个函数的名字,
比如:
variable = setTimeout("func",interval);
具体的问题是这样的:
函数moveElement有四个参数分别为, elementID,final_x,final_y,interval;
具体到:
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";//
//这些参数的引号双引号为什么非得这样写!!! 我们知道定义好的变量用“+” 连接字符串,字符串用双引号等规则.
movement = setTimeout(repeat,interval);
要用不同的引号把一对引号分开,你直接把一对引号当参数解析的时候会解析到闭合的成对的引号会出问题的。。。达不到把引号也传入的效果
你把你拼好的 repeat
的值输出一下, 你就知道为什么要这样了.
你拼好的字符串, 需要为正确的JS代码, 就拿第一个参数来说, 你传递的是一个 id (字符串), 所以你得用 引号 把它引起来, 否则它就是个变量, 在代码执行的时候就会去找相应的变量.
而剩下的参数是数字, 所以不需要拼 引号.
这种东西我实在是想不通怎么会成为一个问题的。
我来给你做一个解析吧,虽然这种问题幼稚。嗯,这里吐槽一下,想不通为啥理解不了,要学会分析问题。
正题开始
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";//
//这些参数的引号双引号为什么非得这样写!!! 我们知道定义好的变量用“+” 连接字符串,字符串用双引号等规则.
movement = setTimeout(repeat,interval);
// 以上是你的问题
// 那么:
var elementID = 'dom_id';
var final_x = 100;
var final_y = 200;
var interval = 10;
// 对于这个字符串连接肯定是没问题吧?
//那么:
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
// 解析后就是:
var repeat = "moveElement('dom_id',100,200,10)" // 这就是repeat最后的结果,为什么是这样?因为:
/**
* var elementID = 'dom_id';
* var final_x = 100;
* var final_y = 200;
* var interval = 10;
*/
// 好了,这上面是原因,那么得到的结果就是:var repeat = "moveElement('dom_id',100,200,10)",重复说了两遍了!!!!!
// 主要的是repeat也是一个变量,repeat这个变量解析之后得到一个字符串
// 好了,下面
movement = setTimeout(repeat,interval);
// 相当于:
movement = setTimeout("moveElement('dom_id',100,200,10)",10);
//这里又为什么啊????
// 因为解析后的repeat:
var repeat = "moveElement('dom_id',100,200,10)"
// 是这样的啊!!!!!!
好了,不多说了,我想应该能明白了吧?
var moveElement = function(elementID,final_x,final_y,interval) {
console.log('elementID:'+elementID'+'<br>final_x:'+final_x+'<br>final_y:'+final_y+'<br>interval:'+interval);
}
// 好了,你告诉我这里又有问题????好吧,我已经差不多无话可说,如果你连console.log都不懂,请找相关资料学习,如果你连字符串连接也不懂?呵呵。
其实我还想补充一点关于setTimeout的用法和js解析相关的东西的,既然你已经采纳了答案,我也懒得补充了。
你这个问题- -先自己调调看
****其实这个问题还有较多值得深思的地方。 我们知道起初 把一个数字赋给一个变量,在控制台能轻而易举的打印出这个变量的值。 这个问题涉及到想要在字符串里引用一个数值然后作为代码执行的问题。****
code:
var num =10;
var repeat = "num";
console.log(typeof repeat); // console string;
//ok,问题来了,想要在字符串里打印出num的值怎么办?
var repeat = ""+num+"";
console.log(repeat) //"10" "string";
最后的部分是作为代码执行
我们在控制台使用eval
typeof eval(repeat) //10 "number"
//ok, 这个能正常的作为数值运行
接下来还有就是原题中的第一个参数 作为字符串的参数
也就是说只要再加一个'' 就能普通的字符串解析运行了
var mess = "message";
var repeat = "'"+mess+"'";
typeof eval(repeat) // "string" "message"值能正常在代码中解析出来.
// 如果你用 "mess" 则不能在代码中执行出来。
结论:
想要把一个字符串在JavaScript环境中解析其中的变量 例如"number"类型的
使用 ""+variable+"";
"string" 类型的:使用 "'"+variable+"'";
(以上所谓的字符串均默认加了参数本身的字符串)
(很惭愧,就做了点微小的工作)
“大家都知道,第一个参数一般是一个字符串”。。。。
难道手册里不是写的第一个参数为function类型?简单举例如下,为何要用字符串拼接。
setTimeout(function() {
moveElement(elementID, final_x, final_y, interval);
}, interval);
这本入门书籍,的确经典,在第十章的时候,使用javaScript实现简单的动画,为了能够抽象化,在函数里面传递了参数,而javaScript里面的内置函数setTimeout函数的第一个参数是字符串,这个时候就涉及到了字符串的拼接,为了让调用函数作为参数放到setTimeout函数里,都保持是一个字符串。
定义的函数是这样的 moveElement(elementId,final_x,final_y,interval),其中第一个参数是一个字符串,其余为number。
而定义的拼接变量为 var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
javaScript里面拼接字符串的时候,都是采用string+string的方式,于是我们可以拆解上述变量
第一个字符串为 "moveElement('"
第二个为变量 elementId
第三个字符串为"',"
第四个为变量final_x
第五个为字符串","
第六个为变量final_y
第七个为字符串","
第八个为变量interval
最后一个味字符串")"
这样拼接后会保留住双引号里面的字符串的原样,所以相当于解析成了如下形式"moveElement('message',100,200,10)",(单引号保留,为了保持传入moveElement函数的第一参数为字符串);
了解这个道理,其实将变量repeat定义为如下形式,也是一样的结果
var repeat ="moveElement(""+elementID+"","+final_x+","+final_y+","+interval+")";
只不过作者没有去使用转义字符,而是使用了单引号被双引号包括时保留原义的用法