0

我有 2 个按钮:button1 和 Button2。我有以下代码:

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

当我单击 button1 时,我得到“hello 2”。我认为这将是关闭,我会得到“你好 1”。请帮忙

4

4 回答 4

3

闭包不保存变量的,它只是保存特定的局部变量实例。所以赋值message = "hello 2"更新了两个闭包中的变量。

于 2013-10-22T18:18:37.183 回答
3

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

然后每个作用域引用它们的父作用域来搜索不属于自己作用域的变量。

于 2013-10-22T18:20:17.590 回答
1

您正在定义一个全局变量message,并为其赋值。当。。。的时候 。on('click'...东西被执行时,message变量的名称嵌入在那些新创建的函数中,而不是它的值在-the-time-the-function-is-defined。

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

如果您的速度快得不可思议并且您的浏览器运行速度相对较慢,那么您可以设法单击您的#button1并获取hello 1如果JS 引擎实际上还没有真正开始执行该message = 'hello 2';行。但这基本上是不可能做到的。你没那么快。

于 2013-10-22T18:18:37.003 回答
0

虽然这些是闭包,但两个闭包都引用了message变量。当#button1on click 函数被调用时(当用户点击它时),它使用变量的当前值,它在你的 ready 函数结束之前message被改变。"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);
  });
});
于 2013-10-22T18:25:09.417 回答