Как узнать, какой ключ вызвал функцию в JavaScript - PullRequest
6 голосов
/ 21 мая 2019

Если у меня есть объект с несколькими ключами, вызывающий одну и ту же функцию, и эта функция реализована вне ее области действия, как определить, какой ключ вызвал эту функцию? Например:

function tellYourAge() {
   return function()
   {
       // I already know here that this refers to Population
       // For example, console.log(this) will print the Population object
   }
}

{
   let Population = {
     Mahdi: tellYourAge(),
     Samuel: tellYourAge(),
     Jon: tellYourAge()
   };

   Population.Mahdi(); // It should log 18
   Population.Samuel(); // It should log 20
   Population.Jon(); // It should log 21
}

Ответы [ 4 ]

9 голосов
/ 08 июня 2019

Возможно

function tellYourAge() {
   return function()
   {
       var f = arguments.callee;
       var key = Object.keys(this).filter(key => this[key] === f)[0];
       console.log(key);
   }
}

{
   let Population = {
     Mahdi: tellYourAge(),
     Samuel: tellYourAge(),
     Jon: tellYourAge()
   };

   Population.Mahdi(); // prints Mahdi
   Population.Samuel(); // prints Samuel
   Population.Jon(); // prints Jon
}

Объяснение: arguments.callee является ссылкой на функцию, к которой принадлежит объект arguments. И this - это, по сути, «вещь перед точкой» в момент вызова функции, поэтому ваш Population объект. Теперь вы ищете экземпляр вызываемой функции в объекте, и все готово.

2 голосов
/ 21 мая 2019
function tellYourAge() {
   return function()
   {
      var s = new Error().stack;
      if(s.includes('Mahdi')){
        console.log('Age is 18');
      }

      else if(s.includes('Samuel')){
        console.log('Age is 20');
      }

      else if(s.includes('Jon')){
        console.log('Age is 21');
      } 
   }
}

{
   let Population = {
     Mahdi: tellYourAge(),
     Samuel: tellYourAge(),
     Jon: tellYourAge()
   };

   Population.Mahdi(); // It should log 18
   Population.Samuel(); // It should log 20
   Population.Jon(); // It should log 21
}
Output:
Age is 18
Age is 20
Age is 21

К вашему сведению, новый Error (). Stack даст вам трассировку стека, как показано ниже,

Error
    at Object.Samuel (<anonymous>:4:20)
    at <anonymous>:1:19
1 голос
/ 11 июня 2019

Я понял, что ваш вопрос заключается в том, как связать возраст человека с его именем. Я бы сделал это, создав объекты, которые описывают людей. Каждый объект будет иметь два атрибута: имя и возраст.

Объекты (люди) будут затем храниться в массиве, который является населением.

// Create a constructor function which defines a Person
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// Create an array of Population to store the Persons (people)
var Population = [];
Population.push(new Person('Mahdi', 18));
Population.push(new Person('Samuel', 20));
Population.push(new Person('John', 21));

// Counter and limit variables
var i, l;

// Loop through the Population and display the information about the people
l = Population.length;
for (i = 0; i < l; i++) {
  let person = Population[i];
  console.log(person.name + " is " + person.age);
}
0 голосов
/ 07 июня 2019

Вы не объяснили , почему вы не хотите "передавать параметр", или что именно точно является требованием не передавать параметр. Я предполагаю, что вы хотите сохранить динамическое возвращаемое целое число (или другое значение) в некотором смысле, специфичном для вашего контекста.

Вот как я мог бы предложить это сделать, хотя пока неясно, хорошая ли это идея:

function tellYourAge() {
  return function(name)
  {
    let ages = {
      Mahdi: 18,
      Samuel: 20,
      Jon: 21,
    };
    return ages[name];
  }
}

{
  let makePopulation = function(names){
    let pop = {};
    names.forEach(function(n){
      pop[n] = tellYourAge().bind(pop, n);
    });
    return pop;
  };

  let Population = makePopulation("Mahdi", "Samuel", "Jon");

  Population.Mahdi(); // It should log 18
  Population.Samuel(); // It should log 20
  Population.Jon(); // It should log 21
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...