Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的闭包_Javascript_Jquery_Closures - Fatal编程技术网

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)。尽管这两种方法都有效