JavaScript中的闭包
我有一个这样的代码,我试图将事件处理程序添加到某个按钮。我想使用一个全局变量&在回调闭包中存储它的当前值&而不是它的引用JavaScript中的闭包,javascript,jquery,closures,Javascript,Jquery,Closures,我有一个这样的代码,我试图将事件处理程序添加到某个按钮。我想使用一个全局变量&在回调闭包中存储它的当前值&而不是它的引用 var globalNum="dummy"; function A() { $("#button").click(function() { $("#button").append(globalNum); }); } globalNum="dummyAgain"; 现在,如果触发了click事件,会添加什么——“dummy”或“dummy”? 我相信这
var globalNum="dummy";
function A()
{
$("#button").click(function()
{
$("#button").append(globalNum);
});
}
globalNum="dummyAgain";
现在,如果触发了click事件,会添加什么——“dummy”或“dummy”?
我相信这将是“DummyReach”,因为闭包全局变量的引用是存储的。我要绑定值。
我知道我可以在一个内部创建一个局部变量,我可以用全局变量初始化并绑定它,但是还有其他更酷的方法吗
谢谢你说得对,它会再次出现。您可以使用并发送一些事件数据来处理此问题:
var globalNum="dummy";
(function A()
{
$("#button").bind('click', {localNum: globalNum}, function(e)
{
$("#button").append(e.data.localNum);
});
})();
globalNum="dummyAgain";
请注意,我立即执行函数A
,因此在globalNum
的值更改之前,单击处理程序被附加到。正如@Andrew在他的评论中指出的,这与根本不使用“包装”功能A
的效果相同
没有绑定的相同解决方案:
(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)
也许有更酷的方法,但在a中声明局部变量是最简单直接的方法,因此是最好的。+1答案。需要指出的是,@Felix_Kling正在使用
bind()
,但在更新globalNum
之前还调用了A()
。我认为这相当于删除A()
函数包装器并直接执行内容。谢谢。但我不想创建本地数据——至少是显式的。否则,我可以在A的主体中定义localNum=globalNum,并在回调函数闭包中追加localNum。并不是说创建本地数据有什么问题,我只是在寻找更酷的东西:)然后使用@Felix Kling的答案,只做一个小改动。将函数A()
更改为函数A(globalParam)
,并在末尾用}(globalParam)调用它
注意,函数内部的globalParam
与函数外部的globalParam
不同。@Felix Kling:没问题。我个人认为你的第一个答案更清晰,可能更容易阅读,但这确实抓住了冷静的因素!这是一个“为了完整性”示例的JSBIN版本为了避免混淆,我对参数名做了一个小小的更改(globalNum>x)。尽管这两种方法都有效