javascript - 对象深度冻结中的递归调用
PHP中文网
PHP中文网 2017-04-11 12:27:29
[JavaScript讨论组]
Object.deepFreeze = function(obj) {
    var propNames = Object.getOwnPropertyNames(obj);
    propNames.forEach(function(name) {
        var prop = obj[name];
        if (typeof prop == 'object' && prop !== null) {
                Object.deepFreeze(prop); // 第六行
            }
        });
        return Object.freeze(obj);
    }
    
    const obj = Object.deepFreeze({
        a: {
            b: 1
        }
    });

在代码的倒数第四行,传入的对象是:

{
  a: {
    b: 1
  }
}

当检测到属性名a的属性值为一个非空对象的时候,对a的属性值进行Object.deepFreeze的递归调用,此时代码第六行运行结束后应该返回的是一个被freeze过的{b:1},然后在继续返回被深度冻结的大对象。

我想问一下,代码中递归调用返回被freeze过的{b:1}之后,这个返回值去哪里了。。。这样就算这个属性a的属性值已经被冻结了吗?然后接下去的代码是如何运行的。。。

我说的有点抽象,不知道各位大佬能看懂么。。。

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
大家讲道理

首先明白冻结返回的是传入的那个对象,内层对象的冻结返回值被废弃了,因为不需要,最后最外层的这个对象被返回,返回时内部所有的对象都被冻结好了

这样说能明白么?

PHPz

forEach里面的返回值会被直接丢弃
Object.freeze会直接冻结其参数,返回值只是冻结对象的一个别名

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

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