以下代码在Head First jQuery一书中提供。
function lightning_one(t) {
$("#lightning1").fadeIn(250).fadeOut(250);
setTimeout("lightning_one()", t);
}; // end lightning_one
用这一行调用它。
lightning_one(3000);
观察到的行为是闪电进出一次,等待3秒,再次淡入和淡出,然后继续淡入淡出。 Firebug没有显示javascript错误。
我理解为什么我会看到我所看到的。我以为我会尝试保留3秒的间隔,所以我改变了这个:
setTimeout("lightning_one()", t); // nothing in the brackets
到此:
setTimeout("lightning_one(t)", t); // t is in the brackets
当我刷新页面时,闪电一次淡入淡出。 Firebug告诉我变量t未定义。
我的问题是,如果在我更改之后没有定义变量t,那么在我更改命令之前,命令是如何运行而没有错误的?它仍然有一个名为t的变量。
更多信息
感谢所有写评论和答案的人。对于记录,在“end”文件夹中,代码变为:
lightning_one();
function lightning_one(){
$("#container #lightning1").fadeIn(250).fadeOut(250);
setTimeout("lightning_one()",4000);
};
我还没有完成适用的章节,所以我不知道代码更改是否会在稍后提出。如前所述,这可能不是最好的书。然而,这是我买的那个,我正在从中学习jQuery的基础知识。
答案 0 :(得分:6)
因为setTimeout
作为字符串的第一个参数是eval
- ed,这意味着它将查看未定义t
的函数的外部范围。第一个很好,因为你不在调用中使用任何变量,但第二个不是因为t
没有在函数范围之外定义。它实际上是本地的。
建议:根本不要使用eval
。实际上,您不需要字符串参数。使用函数表达式:
setTimeout(function() {
lightning_one(t);
}, t);
答案 1 :(得分:2)
将工作:
setTimeout(function () { lightning_one(t); }, t);
我非常确定从String中调用函数(并让它得到评估)是一种应该避免的错误做法。