2010-07-03 46 views
0

我有一个这样的代码,我试图给某个按钮添加一个事件处理程序。我想用全局变量&存储它的当前值回调关闭&不是它的参考。JavaScript中的闭包

var globalNum="dummy"; 
function A() 
{ 
    $("#button").click(function() 
    { 
    $("#button").append(globalNum); 
    }); 
} 

globalNum="dummyAgain"; 

现在,如果单击事件被解雇,将会添加什么 - “dummy”或“dummyAgain”? 我相信这将是“dummyAgain”因为关闭全局变量的引用被存储。我想要绑定的价值。 我知道我可以在A中创建一个局部变量,我可以使用全局变量&进行初始化,但是还有其他更酷的方法吗?

感谢

回答

7

你是对的,它会追加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) 
+1

+1答案。应该指出,@Felix_Kling使用'bind()',而且在更新'globalNum'之前调用'A()'。这与删除'A()'函数包装并直接执行内容是等价的。 – Andrew 2010-07-03 07:36:20

+0

谢谢。 但我不想创建本地数据 - 至少显式。否则,我可以简单地在A的body中定义localNum = globalNum,并在回调函数关闭中添加localNum。 不是说创建本地数据有一些问题,我只是在寻找更酷的东西:) – 2010-07-03 07:41:24

+3

然后用@Felix Kling的答案做一个小改动。将'function A()'改为'function A(globalParam)',并在最后用'})(globalParam)调用它;'请注意函数内部的'globalParam'与外部'globalParam'不同。 – Andrew 2010-07-03 07:47:00

0

也许有一些更酷的方式,但声明中的局部变量是最简单和直接的方式,因此是最好的。