为什么这不是javascript闭包?
我有两个按钮:按钮1和按钮2。我有以下代码:为什么这不是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
$(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
在本地声明的。