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

如何在深度嵌套函数中访问JavaScript对象构造函数参数?

解决嵌套函数中无法访问构造函数实例的问题

兄弟,你这个问题根本不用放弃构造函数啦!核心问题是嵌套函数fn2里的this指向变了,我给你掰扯清楚原因,再给你几个靠谱的解决办法:

为什么第三个console.log输出false?

在JavaScript里,this的指向是由调用方式决定的:

  • 构造函数Obj内部,this指向新创建的实例(也就是Obj2),所以第一个console.log输出true;
  • 当你调用Obj2.fn()时,fn里的this还是指向Obj2,所以第二个console.log也输出true;
  • 但嵌套的fn2是普通函数调用(直接写fn2()),这时候this默认指向全局对象(非严格模式下是window,严格模式下是undefined),不再指向Obj的实例,所以this.a不等于构造函数的参数a,输出false。

解决办法

方法1:提前保存外层的this到变量

把构造函数/外层函数的this存到一个变量(比如self)里,嵌套函数直接用这个变量访问实例:

function Obj(a, b){
    this.a = a;
    this.b = b;
    console.log(this.a == a); // true
    // 保存当前实例的this
    var self = this;
    this.fn = function() {
        console.log(this.a == a); // true
        function fn2() {
            // 用self代替this,访问实例的a
            console.log(self.a == a); // true
            // ...
        }
        fn2();
    };
}
var Obj2 = new Obj(0, 1);
Obj2.fn();

方法2:使用箭头函数(ES6+)

箭头函数的this会继承外层作用域的this,所以把fn2改成箭头函数,它的this就和外层fn里的this一样,指向Obj实例:

function Obj(a, b){
    this.a = a;
    this.b = b;
    console.log(this.a == a); // true
    this.fn = function() {
        console.log(this.a == a); // true
        // 箭头函数继承外层的this
        const fn2 = () => {
            console.log(this.a == a); // true
            // ...
        }
        fn2();
    };
}
var Obj2 = new Obj(0, 1);
Obj2.fn();

方法3:用bind绑定this

调用fn2时,通过bind把外层的this绑定到fn2上:

function Obj(a, b){
    this.a = a;
    this.b = b;
    console.log(this.a == a); // true
    this.fn = function() {
        console.log(this.a == a); // true
        function fn2() {
            console.log(this.a == a); // true
            // ...
        }
        // 绑定当前this到fn2后再调用
        fn2.bind(this)();
    };
}
var Obj2 = new Obj(0, 1);
Obj2.fn();

这几种方法都能完美解决问题,完全不用放弃构造函数,选你觉得顺手的方式就行~

内容的提问来源于stack exchange,提问作者Youdao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:04