变量在Javascript中是如何工作的?可以在setTimeout期间更改变量值

how do variables work in Javascript? Can variable Value change during setTimeout?

本文关键字:setTimeout 变量值 改变 Javascript 何工作 工作 变量      更新时间:2023-11-17

我有以下代码:

function Notification(type) 
{
    switch (type) 
    {
        case "success":
           notificationID="not1";
           break;
        case "error":
           notificationID="not2";
           break;  
    }
    setNotificationTimeoutId = setTimeout(function () {
        jQuery('#' + notificationID).fadeOut(200, function () {
            var notification = document.getElementById(notificationID);
            if (notification) 
            {
                jQuery(notification.parentNode).remove();
                if (type == "success")
                        DoSomething();
            }
            setNotificationTimeoutId = null;
        });
    }, 5000);
}

我的问题是,如果函数(Notification)在一次点击事件中被调用,并且它被两次点击事件调用了两次(第一次是Notification("成功"),然后是Notification)("错误"),那么第二次函数调用是否可能更改第一次函数调用的类型变量值?

例如:当第一个调用(成功的调用)进入setTimeout内的函数时(已经用type="error"对Notification进行了第二次调用),它会将变量"type"视为"error",即使这个调用是第一个,并且是用type="success"调用的?

如果函数Notification在一次点击事件中被调用,并且如果它被两次点击事件调用两次(首先是Notification("success"),然后是Notification("error")),那么第二次函数调用是否可能更改第一次函数调用的type变量值?

没有。type变量是一个参数,因此作用域绑定到您的函数。它的值在随后的调用中不会改变,每个函数调用都会创建该变量的新实例,并且无法访问其他变量。

超时的匿名函数的作用域是Notification的作用域的"子作用域",因此它将始终访问正确的type变量。

但是您的notificationID是一个全局变量(不是本地范围的),对Notification的所有调用和所有超时都将使用同一个变量实例。因此,对Notification的第二次调用会在第一次访问它的超时之前更改它。要解决此问题,请添加var关键字。

或者,由于setNotificationTimeoutId也在外部范围内,并且可以从两个调用中访问,您可以(应该?)在创建新的超时之前清除任何活动超时,方法是添加以下行:

clearTimeout(setNotificationTimeoutId);

您应该本地化notificationID变量,因为它是全局的,允许函数第二次运行时更改第一次运行时的输出。

使用var进行本地化:

 var notificationID;
 switch (type) 
 {
    case "success":
      notificationID="not1";
      break;
    case "error":
      notificationID="not2";
      break;
 }

这对您来说是如何工作的?http://jsfiddle.net/gRoberts/vgSGL/

您可以使用类似的jQuery的延迟方法,而不是使用setTimeout。

希望有帮助?

Gav