首页 > 关于闭包的不理解之处

关于闭包的不理解之处

function test1(){

var i ={name:’nyf’};

}

function test2(){

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

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


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

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

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


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的闭包,这是一个静态的概念,在函数声明的时候就形成~~~~


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


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

用什么来

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

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

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

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

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

  1. 参数;

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

  3. 外部变量,包括

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

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

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

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


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

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"};
【热门文章】
【热门文章】