JavaScript中对象方法赋值给全局变量是值传递还是引用传递?
核心结论
你观察到的现象和值传递、引用传递的定义无关,本质是JS中对象存储方法时,属性仅保存函数的引用地址,赋值操作只会复制这个引用地址,不会和原对象的属性建立绑定关系。
执行过程拆解
- 初始化
module对象时,getX属性存储的是指向第一个匿名函数的内存地址引用 - 执行
let unboundGetX = module.getX时,是将getX属性中存储的引用地址复制一份赋值给unboundGetX,此时两个标识同时指向同一个原始函数 - 后续给
module.getX重新赋值新函数时,仅修改了module对象getX属性存储的引用地址,不会改动unboundGetX中已经存储的旧地址,所以unboundGetX调用的始终是最初的原始函数
测试代码输出说明
const module = { x: 42, getX: function() { console.log(this); return this.x; } }; let unboundGetX = module.getX; module.getX = function () { console.log("hello"); return 10; } console.log(module.getX()); // 输出:hello 10,调用的是新赋值给module.getX的函数 console.log(unboundGetX()); // 输出:全局对象(浏览器环境为window,Node严格模式下为undefined) undefined,调用的是原始函数,因为直接调用unboundGetX时this没有绑定到module对象,全局不存在x属性所以返回undefined
额外误区提示:JS中所有赋值操作都是「将右侧的值复制给左侧」,如果值是引用类型,复制的就是引用地址本身,两个独立的标识修改指向时不会互相影响。
内容的提问来源于stack exchange,提问作者kishoreak
相关产品推荐
相关产品推荐

