为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript对象如何从函数内部获取密钥

Javascript对象如何从函数内部获取密钥

哆啦的时光机 2022-05-26 16:45:06
我已经尝试过此代码以达到目的'keyone',并且可以正常工作。const json = {    'keyone' : function () {         console.log(Object.keys(this)[0]) // it prints keyone when call json.keyone()     } ,    'keytwo' : function () {         console.log(Object.keys(this)[1]) // it prints keytwo when call json.keytwo()     }}json.keyone();json.keytwo();此代码在浏览器中不起作用,返回window. 我希望它返回函数的键名,如下例所示:...'keyname' : function(){    console.log('code for printing this function's keyname')}...我怎样才能做到这一点?
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您调用的函数没有合理的方法知道引用它的属性的名称。如果你愿意,你需要改变你的结构。一种方法是将函数的名称绑定到它作为它的第一个参数:


const json = {

    'keyone' : function (name) {

         console.log(name);

     } ,

     'keytwo' : function (name) {

         console.log(name);

     }

};

for (const [key, func] of Object.entries(json)) {

    json[key] = func.bind(null, key);

}


json.keyone(); // "keyone"

json.keytwo(); // "keytwo"


在不改变结构的情况下执行此操作的不合理方法是在现代浏览器中使用,这种方法在严格模式下不起作用并且我不推荐。arguments.callee.name在现代浏览器中,您的函数具有名称(它们的名称来自您分配给它们的属性)。不推荐使用的arguments.callee属性为您提供了对被调用函数的引用,您可以从中获取它name:


const json = {

    'keyone' : function () {

         console.log(arguments.callee.name);

     } ,

     'keytwo' : function () {

         console.log(arguments.callee.name);

     }

};


json.keyone();

json.keytwo();


但同样,我强烈建议改为更改您的结构。callee已弃用,并且在严格模式下不起作用,并且较旧的浏览器(不支持 ES2015 的隐含函数名称的浏览器)不分配函数名称。


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信