我有以下代码:
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”调用?
答案 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)