Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript函数是否可以知道自己的名称,包括它所包含的对象_Javascript - Fatal编程技术网

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

JavaScript函数是否可以知道自己的名称,包括它所包含的对象,javascript,Javascript,我需要许多JavaScript函数来知道它们自己的名称,包括它们所包含的对象。我似乎找不到办法来做这件事。上面所有的例子都不太适合我的用例。下面是我要找的一把小提琴: 我希望能够创建一个返回myMainNameSpace.a.b或myMainNameSpace.a.b()的函数,这样我就可以将它放在一些函数中。这可能吗?谢谢 不用eval就可以完成,只需迭代每个字母,直到到达aimSign。在每次迭代中,在最后一个嵌套对象中放置一个新对象: function callObjTail(obj){

我需要许多JavaScript函数来知道它们自己的名称,包括它们所包含的对象。我似乎找不到办法来做这件事。上面所有的例子都不太适合我的用例。下面是我要找的一把小提琴:


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

不用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);
函数callObjTail(obj){
var lastObj;
var-lastSign;
对于(var i='a'.charCodeAt();true;i++){
控制台日志(i);
if(obj[String.fromCharCode(i)]){
lastObj=obj;
lastSign=i;
obj=obj[String.fromCharCode(i)];
}
否则{
打破
}
}
if(lastObj){
lastObj[String.fromCharCode(lastSign)]();
}
否则{
obj[Object.keys(obj)[0]]();
}
}
函数buildObj(aimSign){
var obj={};
var头=obj;
var-nests='';
对于(var i='a'.charCodeAt();i
你的意思是?你所问的是一种反思。简短的回答是“不”。较长的回答是“是的,但你不想那样做。”
Eval
是邪恶的,等等。缩小/模糊会破坏它,等等。@Blazemonger
函数。name
不是到处都支持的,并且不能用于像
b:function(args)这样的匿名函数{
如果函数包含在多个对象中会发生什么?这也是你无法知道对象的“名称”的原因。你可以像定义的那样迭代全局变量,找到一个有你的方法的对象,但不知道它是对象……我不知道是哪个“它”(不需要eval就可以完成)这个答案是指。你的
buildObj
在做什么?OP在哪里谈论字母和aimsigns?你是对的,我在我的答案中加入了一些其他函数。嗯,我仍然不知道这些charcode迭代与OP的问题有什么关系?如果它们仅用于示例,它们应该不那么突出。你是对的。实际上,我的注意力集中在最后的问题请求上,不需要打电话给eval。
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);