javascript - 变量未定义,有时

标签 javascript jquery

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

最佳答案

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

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

setTimeout(function() {

    lightning_one(t);

}, t);

关于javascript - 变量未定义,有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13830621/

相关文章:

javascript - 如何使用另一个数组中其他对象的键替换对象数组中的值

javascript - 使 DIV 通过 JavaScript 接受和处理拖放成为可能吗?

javascript - Laravel ajax 身份验证检查工作直到 JS 重定向

javascript - 向 window.location 发送一个变量,该变量从数据库中获取

javascript - 防止触摸时出现超链接并显示悬停状态

iOS 中的 jQuery Mobile 下拉菜单错误

javascript - 互联网机器人 - 填写表格

javascript - 无法识别 AngularJS ng-focus 和 ng-blur

javascript - 从元素的文本中获取整数

javascript if 语句传递真实值