关于闭包的不理解之处

发布于 2022-09-02 00:26:19 字数 241 浏览 21 评论 0

function test1(){

var i ={name:’nyf’};

}

function test2(){

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

东走西顾 2022-09-09 00:26:19

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

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"};
野侃 2022-09-09 00:26:19
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的闭包,这是一个静态的概念,在函数声明的时候就形成~~~~

暮年慕年 2022-09-09 00:26:19

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

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

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

我一直都在从未离去 2022-09-09 00:26:19

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

天赋异禀 2022-09-09 00:26:19

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

用什么来

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

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

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

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

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

  1. 参数;

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

  3. 外部变量,包括

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文