繁体   English   中英

JavaScript中的闭包

[英]Closures in JavaScript

我有这样的代码,我试图在其中添加事件处理程序到某个按钮。 我想使用全局变量并将其当前值存储在回调闭包中,而不是其引用中。

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM