You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:45:02