javascript - js函数与对象都是按引用访问的吗?
PHPz
PHPz 2017-04-10 17:16:02
[JavaScript讨论组]
var obj = {name: 'xixi'};
var anotherObj = obj;
console.log(obj.name);               //xixi
console.log(anotherObj.name);        //xixi

anotherObj.name = 'haha';
console.log(obj.name);               //haha
console.log(anotherObj.name);        //haha
var fun = function(){return 'xixi';};
var anotherFun = fun;
console.log(fun());                          //xixi
console.log(anotherFun());                   //xixi

anotherFun = function(){return 'haha';};
console.log(fun());                          //xixi
console.log(anotherFun());                   //haha

同样是复制一个值,为什么对象改变一个值,另一个也会随之改变;而函数则有不同的表现。哪里出现问题了?

上面的例子可能不恰当,但我想了解的重点是:函数和对象一样,它们是按引用访问的。你们能举一个反映这一特性的函数的例子吗?

PHPz
PHPz

学习是最好的投资!

全部回复(5)
阿神

函数是一种特殊对象,所以它们表现应该是一致的。

之所以你得到了不同的结果,是因为你举的例子不合适!你对对象和函数做了两种不同类型的操作:

  • 例一:改变了对象的属性,两个变量指向的对象都没有变。

  • 例二:改变了第二个变量指向的函数(函数对象)

所以两个例子没有可比性。

对象的例子你已经有了,函数的例子我重新给你举一个,如下:

var fun = function(){return 'xixi';}; 
fun.a = 123;
var anotherFun = fun; 

console.log(fun.a); // 123
console.log(anotherFun.a); // 123

anotherFun.a = 456;

console.log(fun.a); // 456
console.log(anotherFun.a); // 456

这样一来,结果就一致了。

多说一句:函数是一种特殊对象,也可以叫做函数对象。它的特殊性在于可调用

另外,注意区分变量、对象和属性这几个概念。

PHP中文网

对象是引用,你修改的时候修改了原来地址的对象,所以两个都会改变。

而你函数那个赋值你重新赋值,是你重新new了一个对象并没有改变原来 xixi的函数,所以表现不一样

怪我咯

var fun = function(){return 'xixi';};
var anotherFun = fun;
这种写法你就把它当成这样的就能理解了
var anotherFun = function(){return 'xixi';};

你下面再用这个重新赋值就会替换上面的了
anotherFun = function(){return 'haha';};

比如:
var a="xixi";
a="haha";
这样就很容易理解为什么上面和下面获得的不是同一个值

PHP中文网
var obj = {name: 'xixi'};
var anotherObj = obj;

执行这两句的时候,obj和anotherObj 指向同一个对象{name: 'xixi'},所以不论你修改他们之中谁的属性,都会两个同时被修改


再看Function的

var fun = function(){return 'xixi';};
var anotherFun = fun;

执行到这的时候,fun 和anotherFun指向同一个function对象,但当执行到

anotherFun = function(){return 'haha';};

anotherFun 已经被改变了指向,而是指向了新的function(){return 'haha';};,所以两个指向对象就不一样了

巴扎黑

前一个改变的是name 而变量值是指向对象的,两个变量值没变,都是那个对象,而对象的Name变了
后一个直接将第二个值改成另一个函数了,所以两个变量是两个函数,当然不同了

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

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