search

Home  >  Q&A  >  body text

javascript - 关于闭包的不理解之处

function test1(){

var i ={name:’nyf’};

}

function test2(){

var i ={name:’nyf’};
return i;

}
var m1 = test1();
var m2 = test2();
这样的话局部变量i没有释放,算不算构成闭包,为什么?

PHPzPHPz2900 days ago330

reply all(5)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 16:51:12

    楼主的例子当然不算闭包,因为这两个函数执行完之后作用域的“引用”就“销毁”(准备被垃圾回收了)。

    function test1(){
        var i ={name:"nyf"};//执行完成后i就会"销毁"掉
    }
    function test2(){
        var i ={name:"nyf"};
        return i; //执行完成后i就会"销毁"掉,而i会存在返回的结果载体里
    }
    var m1 = test1();//undefined
    var m2 = test2();//Object{name:"nyf"}

    闭包的例子

    function test3(){
        var i ={name:"nyf"};
        return {
            get:()=>i
            , set:name=>i.name=name 
            // 等同于function(name){ return i.name=name; }
        }
    }
    
    var m3 = test3() //这样test3的作用域并没被消除,他的局部变量被返回结果的匿名函数引用了
    console.log(m3.get());//Object{name:"nyf"}
    m3.set("da shui bi")
    console.log(m3.get());//Object{name:"da shui bi"};

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 16:51:12

    function test1(){
        var i ={name:’nyf’};
    }
    function test2(){
        var i ={name:’nyf’};
        return i;
    }
    var m1 = test1();
    var m2 = test2();

    以上2个都不算是闭包
    1) 在一个函数内声明了另一个内部函数才有可能形成闭包
    2)如果声明的函数没有使用其外层函数的变量,那么不能形成闭包,如果引用到就会形成闭包
    如下,没有闭包形成

    function test1(){
        var i ={name:’nyf’};
        return function(){
            console.log('~hello world~');
        }
    }

    test1/test2没有声明过内部函数,就不具备形成闭包的必须条件

    如下,就会有闭包形成

    function test1(){
        var i ={name:’nyf’};
        return function(){
            console.log('name:%s',i.name);
        }
    }

    function test1(){
        var i ={name:’nyf’};
        return {
            address:'addr',
            getUnserInfo:function(){
                console.log('name:%s,address:%s',i.name,this.address);
            }
        }
    }

    function test1(){
        var i ={name:’nyf’};
        function getUnserInfo(){
            console.log('name:%s',i.name);
        }
    }

    闭包形成的是一个函数的作用域链,一个函数A内需要访问其外层函数定义的变量,就会形成函数A的闭包,这是一个静态的概念,在函数声明的时候就形成~~~~

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 16:51:12

    不算,因为m2不能访问到test2()内部的作用域。只是单纯引用了i,然后这个test2()里的i就被销毁了。

    function test3(){
        var i = {name:'nyf'};
        return function(){
            return i;
        }
    }
    m3 = test3();

    这样m3就是等于引用了一个匿名函数,可以通过m3()来得到返回的i值,到这步才算是闭包。
    因为这个函数被引用着,所以test3的作用域没有被销毁。

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 16:51:12

    大家的的回答都很nice,但是只能采纳一个答案,谢谢

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 16:51:12

    闭包闭包,首先要被起来。

    用什么来

    Javascript只有六种数据类型,functionobject似乎都能实现包起来的要求(复杂的数据组合)。

    其次,所谓的,就是作用域,变量只在封闭的范围内有效。

    那么只剩下function能实现了,因为只有function才有作用域的概念。

    但显然并非所有的function都可以称为闭包

    我们知道,JS中的function能够访问它们的:

    1. 参数;

    2. 局部变量或函数(它自己内部定义的);

    3. 外部变量,包括

      3.1 全局变量(DOM,window等)。
      3.2 外部函数的变量或函数。
      

    如果一个函数访问了它的外部变量,那么它就是一个闭包。

    从技术上来讲,在JS中,每个function都可能是闭包,因为它总是能访问在它外部定义的数据。

    http://kb.cnblogs.com/page/110782/

    reply
    0
  • Cancelreply