JavaScript函数是否可以知道自己的名称,包括其中包含的对象

时间:2015-01-22 19:17:09

标签: javascript

我需要一些JavaScript函数来知道自己的名字,包括它们所包含的对象。我似乎找不到办法做到这一点。 SO上的所有示例都不太适合我的用例。这是我正在寻找的小提琴:http://jsfiddle.net/amczpro7/5/

window.myMainNameSpace = {};

myMainNameSpace.y = {
    z: function(funcToCall) {
        var x = eval("new " + funcToCall);
    }
}

myMainNameSpace.a = {
    b: function(args) {
        alert('I want to alert: myMainNameSpace.a.b');

        /*
        var myName = arguments.callee.toString();
        myName = myName.substr('function '.length);
        myName = myName.substr(0, myName.indexOf('('));
        alert(myName);

        console.log(arguments.callee);
        console.log(this.constructor);
        console.log(this.name);
        console.log(this);
        console.log(this.constructor.toString());
        */
    }
}

myMainNameSpace.y.z('myMainNameSpace.a.b({arg1:123})');

我希望能够创建一个返回myMainNameSpace.a.bmyMainNameSpace.a.b()的函数,以便将它放在少数函数中。这可能吗?谢谢!

1 个答案:

答案 0 :(得分:0)

你可以在没有eval的情况下完成它,你只需要迭代每个字母,直到达到aimSign。在每次迭代中,您将一个新对象放在最后一个嵌套对象中:

function callObjTail(obj){

  var lastObj;
  var lastSign;

  for(var i='a'.charCodeAt(); true; i++){
    console.log(i);

    if(obj[String.fromCharCode(i)]){
      lastObj = obj;
      lastSign = i;
      obj = obj[String.fromCharCode(i)];
    }
    else{
      break;
    }


  }

  if(lastObj){
    lastObj[String.fromCharCode(lastSign)]();
  }
  else{
    obj[Object.keys(obj)[0]]();
  }

}
function buildObj(aimSign){

  var obj = {};
  var head = obj;

  var nests = '';
  for(var i='a'.charCodeAt(); i < aimSign.charCodeAt(); i++){

    obj[String.fromCharCode(i)] = {};
    obj = obj[String.fromCharCode(i)];

  }

  return { head : head, tail: obj };

}

var obj = buildObj('e'); 
console.log(obj.head); // { a: { b: { c: { d: {}}}}

console.log(obj);


obj.tail.e = function(){ console.log('tail called');};
console.log(obj.head.a.b.c.d.e());
console.log(obj.tail.e());

// call tail at the end
callObjTail(obj.head);
callObjTail(obj.tail);