function test()
{
for(var i=0;i<5;i++)
{
(function(j){setTimeout(function(){alert(j)},100);})(i+3);
}
}
谈谈对这个函数的理解,看起来很纠结的一句话
{
for(var i=0;i<5;i++)
{
(function(j){setTimeout(function(){alert(j)},100);})(i+3);
}
}
谈谈对这个函数的理解,看起来很纠结的一句话
解决方案 »
- 关于以Json格式在html传值的问题
- jquery treegrid展开问题
- appendChild一个table到一个div后div高度比table高出了许多,这是为什么
- Javascript面向对象编程中遇到的问题,请教JS高手!!!!
- 提交按钮是图像域,怎么做表单验证
- 在网页中链入javascipt问题!!问题解决马上结帖
- 如何对应:随机连续播放图片,在点某张图的时候出现隐藏层,层中显示对应的大图象。如何对应
- 如何修用js改地址栏目的url
- 一个较难的问题,如何在下拉列表中用不同的颜色显示不同的item?
- js ajax调用API问题
- jquery如何用json获取数据?
- 下拉单中的值取不到,请帮帮忙。
function test()
{
for(var i=0;i<5;i++)
{
setTimeout(function(){alert(i+3)},100);
}
}test();
被环境帮定的变量为j如果只是这样写
(function(j){alert(j)})(i+3) 我会认为他只是执行匿名函数 而不是闭包
function test(){
for(var i = 0; i < 5; i++){
(function(j){setTimeout(function(){alert(j)},100);})(i + 3);
}
}
我个人觉得,上面这个不算是闭包,只是一种传参,每次循环的时候都新建一个匿名函数,并把 (i + 3)作为一个参数传给这个匿名函数,传进去的是一个值,传完之后,匿名函数的运行,与i一点关系都没有。
function test(){
for(var i = 0; i < 5; i++){
setTimeout(function(){alert(i + 3)}, 100);
}
}
而这个才算是闭包,因为在匿名函数中直接引用了 i ,当test运行完后,应该是要被回收的,但由于匿名函数的运行要需要 i ,所以 test没有被回收。
首先不是text没回收
是变量i没回收 当test执行完毕后
接着执行延迟的函数 可以打出i的直来
在说如果test是全局的 根本就不会回收.................//--------------------------------------------------------------------至于上面一个你说不是闭包的 也不同意的你的说法函数执行完毕后 里面的变量都是会被销毁的
可是执行function test(){
for(var i = 0; i < 5; i++){
(function(j){setTimeout(function(){alert(j)},1000);})(i + 3);
}
} //我把这里的延迟改成了1000
test()执行完根本用不了1秒 但是后面执行的函数然后能打出3,4,5,6,7
所以j根本就没有释放掉内存 他就是个闭包变量闭包是跟 父函数里面套个子函数 子函数引用着父函数里面的变量 在父函数执行结束后 那个变量并没有被释放掉 在执行子函数的时候 变量仍然能够访问 这是我的理解
为之漫笔的翻译后闭包的 而且最近还修改了的(4.3) 可惜地址现在打不开 明天我在发个连接上来
所谓闭包,是指语法表示包括不必计算的变量的函数。也就是说,该函数能使用函数外定义的变量。
在Ecma中使用全局变量是一个简单的闭包实例:代码:
var mes = "hello world";
function sayHello(){
alert(mes);
}
这样就属于闭包了,只是简单的闭包而已。
下面这个:
function addNum(a,b){
function add(n1,n2){
return n1+n2;
}
return add(a,b);
}
这属于一个复杂的闭包。
(闭包,就是封闭了外部函数作用域中变量的内部函数。但是,如果外部函数不返回这个内部函数,闭包的特性无法显现。如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包。此时,闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放。——译者注,2010年4月3日)提到了 内部函数 外面函数
按我的理解是外面函数就是父函数 内部函数就是子函数就是封闭了外部函数作用域中变量的内部函数
按我的理解就是 子函数里面调用了 父函数中的变量
如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包
虽然这里没有返回子函数 但是在父函数执行完毕后 仍然执行子函数 还是可以显示出闭包的特性 闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放上面的2个例子 i 也好 j也好(都是局部变量)
但是test函数执行完毕后 延迟执行的函数依然能够打印出他们的直出来 可见就是自由变量(按道理来说函数执行完毕后里面的变量是要被销毁的,但是这里i,j都没有被销毁)
闭包 无非就是函数实例运行期产生的一份callObject即函数对象. 实例每运行一次 就会产生一份独立的callObject.仅此而已
这个看下这个就行了.
那依你的见解.那个讨论是 winter 还是周爱民 还是hax是对的? 或者都不对?