我有这样的代码,我试图将事件处理程序添加到某个按钮。我想使用全局变量并将其当前值存储在回调闭包中,而不是其引用中。
var globalNum="dummy";
function A()
{
$("#button").click(function()
{
$("#button").append(globalNum);
});
}
globalNum="dummyAgain";
现在,如果触发了点击事件,将会添加什么-“ dummy”或“ dummyAgain”?
我相信对于封闭全局变量的引用将被存储为“ dummyAgain”。我想要价值绑定。
我知道我可以在A内创建一个局部变量,可以使用全局变量进行初始化并绑定该变量,但是还有其他更酷的方法吗?
谢谢
最佳答案
没错,它将追加dummyAgain。您可以使用bind()
处理此问题并发送一些事件数据:
var globalNum="dummy";
(function A()
{
$("#button").bind('click', {localNum: globalNum}, function(e)
{
$("#button").append(e.data.localNum);
});
})();
globalNum="dummyAgain";
请注意,我会立即执行功能
A
,因此单击处理程序将在globalNum
的值更改之前被附加。正如@Andrew在他的评论中指出的,这与完全不使用“包装”功能A
的效果相同。没有
bind
的相同解决方案:(function()
{
var localNum = globalNum;
$("#button").click(function()
{
$("#button").append(localNum);
});
})();
在这里,匿名函数对于捕获局部变量中的当前值
globalNum
非常有用。更新:
为了完整起见(我希望@Andrew,您不在乎我将其放在此处)。 “最酷”的方法可能是对函数使用参数,并使用以下参数立即执行函数:
var globalNum="dummy";
(function(globalNum)
{
$("#button").click(function()
{
$("#button").append(globalNum);
});
})(globalNum);
globalNum="dummyAgain";
“技巧”是参数的名称和全局变量的名称相同。
这也经常用于指代具有较短标识符的某些对象,而不污染全局名称空间,例如。使用jQuery:
(function($) {
// jQuery == $
})(jQuery)