JavaScript bind方法:函数引用传递与新函数创建疑问
解答
核心结论先放前面:addTax和addVAT根本不指向同一个引用,自然不会出现普通对象赋值的联动效果——因为Function.prototype.bind()从设计上就不是返回原函数的引用,而是创建一个完全独立的新函数对象。
两种场景的本质差异
1. 普通对象引用赋值的逻辑
你举的person示例是最典型的引用拷贝场景:
const person = { name: 'test', }; const person1 = person; person1.age = 20;
这个赋值过程没有生成任何新对象,只是让person1变量和person变量指向堆内存中完全相同的一块地址。不管你通过哪个变量修改这个对象的属性,本质操作的都是同一个内存空间里的内容,所以改动会同步体现。
2. bind()方法的实际运行逻辑
bind()的执行逻辑和直接赋值完全不同,它被调用时会完成以下操作:
- 生成一个全新的绑定函数对象,拥有独立的内存空间,和原函数不是同一个实体
- 在新函数内部存储你传入的
this绑定值、预先固定的前置参数 - 新函数被调用时,会自动用预先存储的
this和固定参数去调用原函数,返回执行结果
你写的示例代码中:
const addTax = (rate, value) => value + value * rate; // 传入null是因为箭头函数本身没有独立的this,不需要绑定上下文 const addVAT = addTax.bind(null, 0.23);
addVAT就是上述逻辑生成的独立新函数,和addTax的内存地址完全不同,你修改addTax的属性不会影响addVAT,反之亦然。
你可以用一行代码快速验证:
console.log(addTax === addVAT)会永远返回false,足以证明两个变量指向的不是同一个对象。哪怕你不预设任何参数,只调用addTax.bind(null),返回的依然是全新的函数,和原函数引用不相等。
常见认知误区
很多人会混淆「引用拷贝」和「基于原对象生成新对象」两个操作:
- 只有直接用
=把存储对象引用的变量赋值给另一个变量时,才会出现两个变量指向同一对象、改动联动的效果 - 所有返回新对象的内置方法——不管是数组的
slice/map、对象的Object.assign/Object.create,还是函数的bind——返回的都是独立内存空间的新实体,和原对象之间不存在属性修改的联动关系。
内容的提问来源于stack exchange,提问作者Ayhan
相关产品推荐
相关产品推荐

