JavaScript 中的闭包

发布于 2024-09-07 17:37:12 字数 402 浏览 2 评论 0原文

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

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

globalNum="dummyAgain";

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

谢谢

I have a code like this where I am trying to add an event handler to some button. I would like to use a global variable & store its current value in callback closure & not its reference.

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

globalNum="dummyAgain";

Now if click event is fired what would be added - "dummy" or "dummyAgain" ?
I believe it would be "dummyAgain" coz for closure global variable's reference is stored. I want value to bind.
I know I can create a local variable inside A which I can initialize with global variable & bind that but is there some other cooler way around too?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

用心笑 2024-09-14 17:37:12

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

You are right, it would append dummyAgain. You can deal with this by using bind() and send some event data:

var globalNum="dummy";
(function A()
{
  $("#button").bind('click', {localNum: globalNum}, function(e)
  {
     $("#button").append(e.data.localNum);
  });
})();

globalNum="dummyAgain";

Note that I immediately execute the function A, so the click handler gets attached before the value of globalNum changes. As @Andrew points out in his comment, this is the same effect as not using the "wrapping" function A at all.


Same solution without bind:

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

Here the anonymous function is useful to capture the the current value globalNum in a local variable.


Update:

For the sake of completeness (I hope, @Andrew, you don't mind that I put it here). The "coolest" way is probably to use a parameter for the function and execute the function immediately with this parameter:

var globalNum="dummy";

(function(globalNum)
 {
  $("#button").click(function()
  {
     $("#button").append(globalNum);
  });
})(globalNum);

globalNum="dummyAgain";

The "trick" is that the name of the parameter and the name of the global variable are the same.

This is also very often used to refer to some object with a shorter identifier without polluting the global namespace, e.g. with jQuery:

(function($) {
    // jQuery == $
})(jQuery)
总攻大人 2024-09-14 17:37:12

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

Maybe there is some cooler way, but declaring a local variable inside A is the most simple and direct way, hence the best.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文