变量如何在Javascript中工作?在setTimeout期间可以变量值变化吗?

时间:2012-07-18 11:50:28

标签: javascript jquery

我有以下代码:

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(“success”),然后通过Notify(“error”))通过两次单击事件调用,是否有可能第二个函数调用更改了第一个函数调用的类型变量值?

例如:当第一次调用(一次成功)进入setTimeout内的函数(第二次调用Notification已经使用type =“error”)时,它将变量'type'视为“错误”,即使这个电话是第一个,它用type =“success”调用?

3 个答案:

答案 0 :(得分:2)

  

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

没有。 type变量是一个参数,因此范围与函数绑定。它的值不会在后续调用中发生变化,每个函数调用都会创建此变量的新实例,并且无法访问其他变量。

你的超时匿名函数的范围是Notification的一个“子范围”,所以它总是会访问正确的type变量。

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

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

clearTimeout(setNotificationTimeoutId);

答案 1 :(得分:1)

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

使用var to localize:

 var notificationID;

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

答案 2 :(得分:0)

这对你有什么用? http://jsfiddle.net/gRoberts/vgSGL/

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

希望有帮助吗?

GAV株系