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

如何获取JavaScript中被调用函数的父函数名称?

获取JavaScript嵌套函数的父对象名称

嘿,这个问题挺常见的——想在嵌套的方法里拿到它所属父对象的键名对吧?我给你几个靠谱的方案,你可以根据自己的场景选:

方案1:手动添加父名称属性(简单直接)

最直观的方式就是给每个父对象加一个parentName属性,然后子方法通过this访问它。这种方式适合结构固定、不会动态变化的对象:

var functions = {
    coolfunction1: {
        parentName: 'coolfunction1',
        add: function () { console.log(this.parentName); },
        delete: function () { console.log(this.parentName); },
        save: function () { console.log(this.parentName); }
    },
    coolfunction2: {
        parentName: 'coolfunction2',
        add: function () {
            console.log(this.parentName); // 调用后输出: coolfunction2
        },
        delete: function () { console.log(this.parentName); },
        save: function () { console.log(this.parentName); }
    }
}

functions.coolfunction2.add(); // 输出 "coolfunction2"

优点:实现简单,可读性强,没有兼容性问题;缺点:如果对象结构复杂或需要动态生成,手动维护parentName会很麻烦。

方案2:遍历对象自动绑定(适合动态场景)

如果你的functions对象是动态生成的,或者子对象很多,可以通过遍历自动给每个父对象添加parentName,甚至绑定方法的this上下文避免指向问题:

var functions = {
    coolfunction1: {
        add: function () { console.log(this.parentName); },
        delete: function () { console.log(this.parentName); },
        save: function () { console.log(this.parentName); }
    },
    coolfunction2: {
        add: function () {
            console.log(this.parentName); // 调用后输出: coolfunction2
        },
        delete: function () { console.log(this.parentName); },
        save: function () { console.log(this.parentName); }
    }
}

// 遍历所有父对象,自动添加parentName并绑定this
for (const parentKey in functions) {
    if (functions.hasOwnProperty(parentKey)) {
        const parentObj = functions[parentKey];
        parentObj.parentName = parentKey;
        
        // 给每个子方法绑定this到父对象,防止this指向丢失
        Object.values(parentObj).forEach(item => {
            if (typeof item === 'function') {
                parentObj[item.name] = item.bind(parentObj);
            }
        });
    }
}

functions.coolfunction2.add(); // 输出 "coolfunction2"

优点:一次遍历搞定所有子对象,不用重复写代码;缺点:需要确保遍历逻辑在方法调用前执行。

不推荐的方案:利用Error栈追踪

有些同学可能会想到用new Error().stack解析栈信息来获取父对象名称,但这个方法非常不可靠——不同浏览器、Node.js环境的栈格式差异很大,而且代码压缩后变量名会被混淆,根本没法准确提取到coolfunction2这种名称。所以除非你只是临时调试,否则不建议用这个方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:29