2

我有以下代码:

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);
}

我的问题是,如果函数(通知)在点击事件上被调用,并且如果它被两次点击事件调用两次(首先是通知(“成功”)然后是通知(“错误”)),是否有可能第二个函数调用会更改第一个函数调用的类型变量值吗?

例如:当第一次调用(成功)进入 setTimeout 内的函数时(第二次调用 Notification 已经使用 type = "error"),即使这个调用是第一个,它是用 type = "success" 调用的?

4

3 回答 3

2

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

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

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

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

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

clearTimeout(setNotificationTimeoutId);
于 2012-07-18T12:02:03.383 回答
1

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

使用 var 进行本地化:

 var notificationID;

 switch (type) 
 {
    case "success":
      notificationID="not1";
      break;
    case "error":
      notificationID="not2";
      break;
 }
于 2012-07-18T11:58:56.733 回答
0

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

除了使用 setTimeout,你可以使用 jQuery 的 delay 方法,它是类似的。

希望能帮助到你?

加夫

于 2012-07-18T12:06:50.847 回答