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级讲师

全部回复(4)
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中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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