我对此代码感到非常困惑:
var closures = [];
function create() {
for (var i = 0; i < 5; i++) {
closures[i] = function() {
alert("i = " + i);
};
}
}
function run() {
for (var i = 0; i < 5; i++) {
closures[i]();
}
}
create();
run();
据我了解,它应该打印0、1、2、3、4(这不是闭包的概念吗?)。
而是打印5、5、5、5、5。
我尝试了Rhino和Firefox。
有人可以向我解释这种行为吗?提前谢谢。
通过添加其他匿名函数来修复Jon的答案:
function create() {
for (var i = 0; i < 5; i++) {
closures[i] = (function(tmp) {
return function() {
alert("i = " + tmp);
};
})(i);
}
}
解释是JavaScript的作用域是函数级的,而不是块级的,创建闭包仅意味着将封闭范围添加到封闭函数的词法环境中。
循环终止后,函数级变量i
具有值5
,这就是内部函数所看到的。
附带说明:您应该提防不必要的函数对象创建,尤其是在循环中;它效率低下,并且如果涉及DOM对象,则创建循环引用很容易,因此会在Internet
Explorer中引入内存泄漏。
问题内容: 我对此代码感到非常困惑: 据我了解,它应该打印0、1、2、3、4(这不是闭包的概念吗?)。 而是打印5、5、5、5、5。 我尝试了Rhino和Firefox。 有人可以向我解释这种行为吗?提前谢谢。 问题答案: 通过添加其他匿名函数来修复Jon的答案: 解释是JavaScript的作用域是函数级的,而不是块级的,创建闭包仅意味着将封闭范围添加到封闭函数的词法环境中。 循环终止后,函数级
本文向大家介绍浅谈JavaScript的全局变量与局部变量,包括了浅谈JavaScript的全局变量与局部变量的使用技巧和注意事项,需要的朋友参考一下 一、JavaScript scope 的划分标准是function函数块,不是以 if、while、for来划分的 二、JavaScript在执行之前会对整个脚本文件进行预编译(对脚本文件的声明部分做分析,包括局部变量部分),从而确定实变量的作用域
问题内容: 看到: 问题在于,警报的item.id始终是数组中最后一个项目的ID(this.items)。怎么解决? 问题答案: 这里的问题是变量随每个循环而变化。在以后参考时,将使用其保留的最后一个值。您可以使用一种称为闭包的技术(本质上是一个返回函数的函数)来快速确定变量的范围。 旁注我看到您在这里有jQuery。它具有可以与数组一起使用的辅助函数,并且可以作为简单的for/each循环的快捷
闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如: Route::get('hello', function () { return 'hello,world!'; }); 参数传递 闭包定义的时候支持参数传递,例如: Route::get('hello/:name', function ($name) { return 'Hello,'
下面是代码: null null 当我点击乘法或除法按钮触发函数时,我得到的结果是NAN,但我认为num1和num2都是全局变量,有人能帮我弄清楚为什么这两个都没有定义吗?
本文向大家介绍javascript中局部变量和全局变量的区别详解,包括了javascript中局部变量和全局变量的区别详解的使用技巧和注意事项,需要的朋友参考一下 javascript有两种变量:局部变量和全局变量。当然,我们这篇文章是帮助大家真正的区别这两种变量。 首先,局部变量是指只能在本变量声明的函数内部调用。全局变量时整个代码中都可以调用的变量。当然,单单从字面上理解肯定是不清楚的,下面我