javascript - JS函数传递一个引用类型的参数
PHPz
PHPz 2017-04-10 16:04:18
[JavaScript讨论组]
    function box(obj){  
        obj.name = "Lee";
    }
    var obj = new Object();
    obj.name = "Look";
    box(obj);
    console.log(obj.name);   //打印Lee
    function box(obj){ 
        obj.name = "Lee";
    }
    var obj = new Object();
    box(obj);
    obj.name = "Look";
    console.log(obj.name);   //打印Look

上面2段代码中,obj.name = "Look"这句代码放置的位置不同,为什么结果差别这么大?

PHPz
PHPz

学习是最好的投资!

全部回复(2)
ringa_lee

注意下,js中是没有按引用传递这一说法的,引用类型作为参数传入到函数中算是按共享传递,对象obj其实也是一个指针啊,所以传参过程就是obj将其地址复制给box函数中的局部变量obj中,其实全局的obj与函数中局部obj指向的是内存中的同一块地址,所以可以看出,函数也可以修改对象obj的属性值,你上面的代码相当于

var obj = new Object();
obj.name = "Look";
obj.name = "Lee";
console.log(obj.name);   // 这肯定是Lee把
var obj = new Object();
obj.name = "Lee";
obj.name = "Look";
console.log(obj.name);   // 这肯定是Look把
迷茫

在JS中函数的参数传递都是值传递,没有引用传递。var obj = new Object()这个obj的值是个指针,指向新创建的Object类型的对象,而这个对象是放在堆中的。全局中的obj引用了这个对象。当全局中的obj传到box(obj)中时,由于是值传递,在函数中的变量obj(这是个局部变量和全局中的obj毫无关系)就指向了堆中的object对象,也就是说此时有两个变量(分别是局部的obj和全局的obj)同时指向了堆中的同一个object对象,两个做的任何操作都会影响到堆中的同一个Object对象。所以obj.name的最终值取决于你对它的最后更改。

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

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