为什么这不是一个javascript闭包
Why is this not a javascript closure?
>我有 2 个按钮:按钮 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时,我得到"hello 2"。 我以为这将是结束,我会得到"你好 1"。 请帮忙
闭包不会保存变量的值,它只是保存特定的局部变量实例。因此,赋值message = "hello 2"
更新两个闭包中的变量。
中的 Scope 是函数中的 hold。每次声明函数时,它都会创建一个作用域(闭包)。所以,是的,你创建了一个闭包,但你看到的行为是你应该期待的。
在这里,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
然后,每个作用域都引用其父作用域,以搜索不属于其自身作用域的变量。
您正在定义一个全局变量message
,并为其赋值。当 .on('click'...
执行内容时,message
变量的 NAME 嵌入到那些新创建的函数中,而不是它在定义函数时的值。
因此,当您实际单击这些按钮时,JS会获取嵌入在函数中的变量NAME,查找其CURRENT值(即"hello 2"),然后就是您的输出。
如果你的速度快得不可思议,你的浏览器运行相对较慢,你可能会设法点击你的#button1
并得到hello 1
,如果JS引擎实际上还没有设法真正开始执行那message = 'hello 2';
行。但这基本上是不可能的。你没那么快。
虽然这些是闭包,但两个闭包都引用了message
变量。当调用 #button1
on click 函数时(当用户单击它时),它使用 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);
});
});
- 我应该如何从xml文件构建一个javascript页面
- 有没有一个javascript图形绘制库可以进行气球树布局
- 如何将一个JavaScript函数回调为多个函数
- 代码背后调用一个JavaScript函数的按钮点击-C#
- 多次调用另一个javascript函数中的javascript函数
- HTML外部javascript加载另一个javascript
- 在一个javascript文件中为整个网站创建标签
- 在任何AJAX调用之前触发一个javascript函数
- 如何用另一个Javascript更改Javascript函数值
- 动态创建一个javascript/jquery多级数组
- 将变量值从一个javascript传递到另一个javascript
- 获取一个javascript对象attr's
- 是一个javascript bookmarklet,可以设置破坏跨域安全的域cookie
- PNG图像被覆盖,但每个图像都有一个链接可以更改,每次一个-Javascript/jQuery/CSS
- 添加一个javascript函数来下载elfinder上的事件
- 有没有一个Javascript代码可以看到你的缓存有多满
- 使用jenkins从不同文件夹中的文件构建一个javascript文件
- 是否有一个javascript库来解析简单的查询
- 一个javascript实现base64图像编码并将结果写入文本文件
- 使用一个Javascript函数提交多个表单可以在FF中工作,而不需要其他浏览器