Javascript 获取分配给的变量函数的名称

Javascript 获取分配给的变量函数的名称,javascript,node.js,Javascript,Node.js,我试图返回函数分配给的变量的名称 我在下面举了一个例子。最终结果是我希望modelPerson.title()返回变量名title 例如,我有以下代码: 定义一些基本模型类型 var types = { string: function() { return function() { return "I want this to return 'title'"; } } }; 使用模型类型 var modelPerson

我试图返回函数分配给的变量的名称

我在下面举了一个例子。最终结果是我希望
modelPerson.title()
返回变量名
title

例如,我有以下代码:

定义一些基本模型类型

var types = {
    string: function() {
        return function() {
            return "I want this to return 'title'";
        }
    }
};
使用模型类型

var modelPerson = {
    title: types.string(),
    firstName: types.string(),
    surname: types.string(),
    position: types.string()
};
尝试返回标题

console.log(modelPerson.title());
抱歉,如果这有点不清楚。我已经包括了一个JSFIDLE,如果它有帮助的话:


谢谢你给我的帮助,我不知道这是干什么用的,但是

var modelPerson = {
 title : function title(){ return arguments.callee.name; },
 firstName : function firstName(){ return arguments.callee.name; },
 surname : function surname(){ return arguments.callee.name; },
 position : function position(){ return arguments.callee.name; },
}
我应该照你说的做

编辑

班扎伊~

var types = {
 string: function(){
  eval('var x = function '+arguments.callee.caller.name+'(){var x = function(){return arguments.callee.caller.name;}; return x();}');
  return x(); 
 }
};
var modelPerson = {
 title: function title(){ return types.string(); },
 firstName: function firstName(){ return types.string(); },
 surname: function surname(){ return types.string(); },
 position: function position(){ return types.string(); }
};
SRSLY尽管如此

var types = {
 string: function(x){
  return function(){ return x; }
 }
};
var modelPerson = {
 title: types.string('title'),
 firstName: types.string('firstName'),
 surname: types.string('surname'),
 position: types.string('position')
};
最终结果是我希望modelPerson.title()返回变量名title

然后使用类似的方法:

function define(obj, name) {
    obj[name] = function() {
        return name;
    };
}

var modelPerson = {};
define(modelPerson, "title");
define(modelPerson, "firstName");
define(modelPerson, "surname");
define(modelPerson, "position");
//                  … - a loop maybe?


下面是一个可以在严格模式下工作的方法(没有不推荐的arguments.callee或Privative arguments.callee.caller属性),使用您的代码进行最小的重新分解,并且没有硬编码的名称:

var types={
    string: function types(){       
           return function me() { 
               for(var it in this){
                    if(me==this[it]) return it;
               }
        };
    }
};


var modelPerson = {
    title: types.string(),
    firstName: types.string(),
    surname: types.string(),
    position: types.string()
};


alert( modelPerson.title() ); // shows: "title"
alert( modelPerson.surname() ); // shows: "surname"
我试图返回一个函数分配给的变量的名称


你不能,不可靠。多个变量或属性可以引用同一个对象,有些对象存在时从未分配给变量(例如没有立即调用的名称的函数表达式)。

这实际上是可能的,但涉及一些特定于v8的内容:

var types = {
    string: function() {
        return function() {
          var obj = {};
          var prepare = Error.prepareStackTrace;
          Error.prepareStackTrace = function (_, stack) {
            return stack
          }

          Error.captureStackTrace(obj)

          var method = obj.stack[0].getMethodName();

          Error.prepareStackTrace = prepare;

          return method;
        }
    }
};

var modelPerson = {
    title: types.string(),
    firstName: types.string(),
    surname: types.string(),
    position: types.string()
};

console.log(modelPerson.title());
console.log(modelPerson.firstName());

但是你可能应该使用一些不那么疯狂的东西

什么东西不正常工作?嗨,马克。我希望函数
string()
返回分配给它的变量的名称。在这种情况下,它应该返回一个字符串
title
好的,没关系,我知道你想做什么了是的,它返回字符串
“我希望它返回'title'”
。什么东西没有按预期工作?实现这种反射的唯一方法是在modelPerson和when arguments.callee==modelPerson[k],alert(k)中迭代值。我想他/她希望它能适用于所有可能的函数,而不仅仅是sehi,谢谢你的回答。不幸的是,我更好奇的是
string
函数是否可以返回这个,因为它被深埋了两层。但是很好的尝试:)在这里,但它是完全可怕的。它很有趣。^^^顺便说一句-您可以创建一个函数addAttr(name),它可以使用正确的返回值将这4个属性添加到modelPerson。您将创建一个空的modelPerson={};然后Object.prototype.addAttr=function(name){this[name]=function(){return name;}};然后是modelPerson.addAttr('title');这是一个非标准的问题,不是吗?这只适用于函数作为对象的方法调用,并且引用了objetct的情况。在函数执行上下文(如
(function(){var a=modelPerson.title;a();}())
)中,如果未将其设置为正确的对象,它将不起作用,并且在严格模式下也不起作用。@RobG:没错,但这在OP请求的模式下起作用。@dandavis:抱歉,您发布了您的答案,而我键入了我的答案,所以我没有看到它。我尊重您的速度,因此我删除了我的答案,并给您的答案a+1。@dandavis OP询问变量,但示例使用对象属性:-/这在一个包罗万象的普遍意义上是正确的,但在OP概述的有限场景中是不正确的,没有这些潜在的复杂性。也就是说,我确实认为有更好的方法来实现这种反射,即使这意味着一些硬/双重编码。。。
var types = {
    string: function() {
        return function() {
          var obj = {};
          var prepare = Error.prepareStackTrace;
          Error.prepareStackTrace = function (_, stack) {
            return stack
          }

          Error.captureStackTrace(obj)

          var method = obj.stack[0].getMethodName();

          Error.prepareStackTrace = prepare;

          return method;
        }
    }
};

var modelPerson = {
    title: types.string(),
    firstName: types.string(),
    surname: types.string(),
    position: types.string()
};

console.log(modelPerson.title());
console.log(modelPerson.firstName());