javascript - 闭包修改局部变量后返回局部变量仍是原始值
PHP中文网
PHP中文网 2017-04-11 11:19:14
[JavaScript讨论组]
function test() {
    var n=1;
    var add = function () {
        n++;
        console.log(n);
    };
    return{n:n,add:add};
}
var t1=test();
var t2=test();
t1.add();//输出2
t1.add();//输出3
var b = t1.n;

这里的b为什么还是1?

PHP中文网
PHP中文网

认证0级讲师

全部回复(5)
ringa_lee

应该这样写:

function test() {
    var n=1;
    var add = function () {
        n++;
        console.log(n);
    };
    return {
        getN(){return n;},add:add
    }
}

你之前的写法应该是类似这样的:

function test() {
    var n=1;
    var add = function () {
        n++;
        console.log(n);
    };
    var m = n;
    return {
        n:m, //这里只是n的值
        add:add
    };
}
迷茫

执行到 var t1 = test() 后,变量 t1 的结构:

  {
    n: 1,
    add: [func...]
  }

即使后面再怎么执行 t1.add(), 都没有操作已经赋值的变量 t1,这里注意仅仅是闭包中的 n 变了,t1.n 已经在执行上面代码段的时候赋值了,后续又没有操作 t1,t1.n 当然不会变咯

PHP中文网

这里闭包返回的t1实际上是这样的 {n:1,add:add}, 返回的并不是test内n的引用, 所以t1.n等于1

阿神

试试这段代码

function test() {
    var n=1;
    var add = function () {
        n++;
        console.log(n);
    };
    return{n:function(){return n},add:add};
}
var t1=test();
var t2=test();
t1.add();//输出2
t1.add();//输出3
var b = t1.n();//输出 3
PHP中文网

首先
闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

在test内部打印n

输出:

由此可见 test中的n以及它的值一直存放在内存中。
为什么会这样呢?原因就在于test是add的父函数,而add被赋给了一个全局变量,这导致add始终在内存中,而add的存在依赖于test,因此test也始终在内存中,不会在调用结束后,被垃圾回收机制回收。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号