javascript对象的属性不是引用传递的吗?

window.reply=(function()
{
    var is_ready=false;
    function ready(callback)
    {
        is_ready=true;
        callback && callback();
    }
    return {
        is_ready:is_ready,
        ready:ready
    }
}());
if(reply.is_ready)
{
    test();
}
else
{
    reply.ready(test);
}
function test()
{
    console.log(reply.is_ready);
}

上面的打印结果是false,为何不是引用传递的呢?

阅读 3.3k
3 个回答

基本类型传值 引用类型传reference.

复制某个对象的某个变量是对象的引用。但为对象添加属性,操作的是实际对象。不是引用传递

javascript中参数的传递都是按值传递的,只不过对于基本类型传递实际值,对于对象传递对象地址。
javascript一个属性的对应的"值"只计算一次,除非你对其重新赋值改变它。
对应到你的问题,也就是reply对象的is_ready的值和ready对应的函数对象在匿名函数执行完毕后就是确定的固定的,是不变化的-基本类型值固定,对象包括函数对象地址固定,除非你对is_ready和ready重新赋值
例如代码修改为:

window.reply=(function()
{
    var is_ready=false;
    var returnOBJ;
    function ready(callback)
    {
        is_ready=true;
        returnOBJ.is_ready= is_ready;
        callback && callback();
    }
    returnOBJ={
        is_ready:is_ready,
        ready:ready
    };
    return returnOBJ;
}());
if(reply.is_ready)
{
    test();
}
else
{
    reply.ready(test);
}
function test()
{
    console.log(reply.is_ready);
}

结果为true

也可以修改成这样

window.reply=(function()
{
    var is_ready=false;
    function ready(callback)
    {
        is_ready=true;
        callback && callback();
    }
    return {
        is_ready:function(){
            return is_ready;
        },
        ready:ready
    }
}());
if(reply.is_ready())
{
    test();
}
else
{
    reply.ready(test);
}
function test()
{
    console.log(reply.is_ready());
}

结果同样为true

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题