5

以下代码在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 的基础知识。

4

2 回答 2

6

因为setTimeoutas a string 的第一个参数是eval-ed,这意味着它将查看t未定义的函数的外部范围。第一个很好,因为您没有在调用中使用任何变量,但第二个不是因为t没有在函数范围之外定义。它实际上是本地的。

建议:根本不要使用eval。实际上,您不需要字符串参数。使用函数表达式:

setTimeout(function() {

    lightning_one(t);

}, t);
于 2012-12-12T00:07:37.483 回答
2

起作用:

setTimeout(function () { lightning_one(t); }, t); 

我很确定从 String 调用函数(并让它被评估)是一种应该避免的不好的做法。

于 2012-12-12T00:09:30.147 回答