function test()
{
       for(var i=0;i<5;i++)
         {
                (function(j){setTimeout(function(){alert(j)},100);})(i+3);
         }
}
谈谈对这个函数的理解,看起来很纠结的一句话

解决方案 »

  1.   

    你说这个是闭包  我承认那你说这样是闭包吗???????
     function test()
    {
           for(var i=0;i<5;i++)
             {
                  setTimeout(function(){alert(i+3)},100);
             }
    }test();
      

  2.   

    我不同意你的观点     我认为这是个闭包
    被环境帮定的变量为j如果只是这样写
     (function(j){alert(j)})(i+3)  我会认为他只是执行匿名函数    而不是闭包
      

  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没有被回收。
      

  4.   

    我觉得你说的不对 
    首先不是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)  可惜地址现在打不开  明天我在发个连接上来
      

  5.   

    我在JavaScript高级程序设计中是这样定义的:
    所谓闭包,是指语法表示包括不必计算的变量的函数。也就是说,该函数能使用函数外定义的变量。
    在Ecma中使用全局变量是一个简单的闭包实例:代码:
    var mes = "hello world";
    function sayHello(){
      alert(mes);
    }
    这样就属于闭包了,只是简单的闭包而已。
    下面这个:
    function addNum(a,b){
      function add(n1,n2){
        return n1+n2;
      }
      return add(a,b);
    }
    这属于一个复杂的闭包。
      

  6.   

    http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html为之漫笔的 闭包 解释............Closure
        (闭包,就是封闭了外部函数作用域中变量的内部函数。但是,如果外部函数不返回这个内部函数,闭包的特性无法显现。如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包。此时,闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放。——译者注,2010年4月3日)提到了 内部函数 外面函数
    按我的理解是外面函数就是父函数   内部函数就是子函数就是封闭了外部函数作用域中变量的内部函数
    按我的理解就是 子函数里面调用了 父函数中的变量
    如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包

    虽然这里没有返回子函数  但是在父函数执行完毕后 仍然执行子函数   还是可以显示出闭包的特性 闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放上面的2个例子   i 也好 j也好(都是局部变量)
    但是test函数执行完毕后  延迟执行的函数依然能够打印出他们的直出来   可见就是自由变量(按道理来说函数执行完毕后里面的变量是要被销毁的,但是这里i,j都没有被销毁)
      

  7.   


    闭包 无非就是函数实例运行期产生的一份callObject即函数对象. 实例每运行一次 就会产生一份独立的callObject.仅此而已
      

  8.   

    如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
      

  9.   

    http://bbs.51js.com/viewthread.php?tid=81886&highlight=%B1%D5%B0%FC
    这个看下这个就行了.
      

  10.   


    那依你的见解.那个讨论是 winter 还是周爱民 还是hax是对的? 或者都不对?