Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.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_Closures - Fatal编程技术网

为什么这不是javascript闭包?

为什么这不是javascript闭包?,javascript,closures,Javascript,Closures,我有两个按钮:按钮1和按钮2。我有以下代码: $(document).ready(function() { var message = "hello 1"; $("#button1").on("click", function() { alert(message); }); message = "hello 2"; $("#button2").on("click", function() { alert(message); }); }); 当我点击按钮1

我有两个按钮:按钮1和按钮2。我有以下代码:

$(document).ready(function() {
  var message = "hello 1";
  $("#button1").on("click", function() {
    alert(message);
  });
  message = "hello 2";
  $("#button2").on("click", function() {
    alert(message);
  });
});

当我点击按钮1时,我得到了“你好2”。我想这将是结束,我会得到“你好1”。请帮助定义全局变量
消息并为其赋值。当执行('click'…
填充时,
消息
变量的名称嵌入到新创建的函数中,而不是定义函数时的值

因此,当您实际单击这些按钮时,JS会获取嵌入在函数中的变量名,查找其当前值(即“hello 2”),这就是您的输出


如果你的速度快得不可思议,浏览器运行得相对较慢,你可能会点击
#按钮1
,得到
hello 1
如果JS引擎还没有真正开始执行
消息='hello 2';
行,但这基本上是不可能的。哟你没有那么快。

闭包不保存变量的值,它只保存一个特定的局部变量实例。因此赋值
message=“hello 2”
更新两个闭包中的变量。

JavaScript中的作用域保存在一个函数中。每次声明一个函数时,它都会创建一个作用域(闭包)是的,您创建了一个闭包,但是您看到的行为是您应该期望的

这里,
message
的作用域是文档就绪回调。每次单击处理程序在搜索消息变量值时都引用相同的作用域。因此,
message
变量在触发单击事件时保持相同的值

要查看它,只需检查范围作为链:

"document ready"
  - var message (it is declared here and can only have one value at a given time)
  - "#button1 click handler"
    - no var (so it'll search the parent scope for the value)
  - "#button2 click handler"
    - no var

然后,每个作用域引用其父作用域以搜索不属于其自身作用域的变量。

当这些都是闭包时,两个闭包都引用
消息
变量。当调用单击时的
#按钮1
函数时(当用户单击该函数时),它使用
消息
变量的当前值,该变量在就绪函数结束前更改为
“hello 2”

您可以通过不对不同的消息重复使用相同的变量来避免这种情况,如下例所示:

$(document).ready(function() {
  var message1 = "hello 1";
  $("#button1").on("click", function() {
    alert(message1);
  });
  var message2 = "hello 2";
  $("#button2").on("click", function() {
    alert(message2);
  });
});

javascripts中的闭包不复制父作用域,因此,如果消息在作用域之外更改,则在作用域之内也会更改。每个侦听器函数都是闭包(或者是闭包的一部分,具体取决于您对它的看法)。闭包是功能代码加上一组范围内变量。在这种情况下,两个闭包都有相同的范围内变量集,因此它们有一个共享的
消息
变量。它不是全局变量,因为它是用
var
在本地声明的。