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

时间:2014-02-09 21:56:00

标签: javascript node.js

我正在尝试返回分配了函数的变量的名称。

我在下面列举了一个例子。最终结果是我希望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());

对不起,如果有点不清楚。我有一个JSFiddle,如果它有帮助: http://jsfiddle.net/4f6VE/

感谢您提供任何帮助

5 个答案:

答案 0 :(得分:4)

这实际上是可行的,但涉及一些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());

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

答案 1 :(得分:2)

我真的不知道这是为了什么,但是

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; },
}

应该按照你说的做。

修改

Banzaaai~!

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 THOUGH

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')
};

答案 2 :(得分:1)

  

我正在尝试返回将函数分配给

的变量的名称

你不能,不可靠。有几个变量或属性可以引用同一个对象,并且某些对象不会被分配给变量(例如没有立即调用名称的函数表达式)。

答案 3 :(得分:0)

  

最终结果是我希望modelPerson.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?

> console.log(modelPerson.title());
"title"

答案 4 :(得分:0)

这是一个可以在严格模式下工作的方法(没有弃用的arguments.callee或专有的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"