变量在Javascript中是如何工作的?可以在setTimeout期间更改变量值
how do variables work in Javascript? Can variable Value change during setTimeout?
我有以下代码:
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
- JavaScript:单击时相对于父级增加变量值
- 如何通过ajax增加/减少PHP变量值并重新加载函数
- 如何从特定页面中提取php变量值
- JavaScript模数未正确递增变量值
- 替换另一个变量对象中的变量值
- mandrill合并标记不接受变量值
- 将变量值从一个javascript传递到另一个javascript
- 如何将变量值附加到另一个变量
- html类名中的数字形式的Javascript变量值
- 如何在C#中获取Javascript变量值
- 如何将C#变量值传递给javascript以使用amcharts
- 正在从addEventListener中获取变量值
- 使用变量值作为'名称标识符'javascript/html
- 为什么在以下代码段中无法访问中的变量值
- 我们可以在初始化variable Angular JS时将变量值声明为未定义吗
- 在HTML/Javascript文件中获取App Inventor 2变量值
- 将变量值传递给另一个函数
- jQuery UI对话框窗体-缺少变量值
- setTimeout变量值未定义
- 变量值更改不会延迟setTimeout