возможно ли 1) имена параметров console.log в функции? 2) ввести строку в качестве аргумента функции, но преобразовать ее в ссылку на объект?

Я слишком долго крутил это вокруг своей головы. Спасибо всем, кто может помочь!

var foo = {key: 'value'};

Пример 1:

var stringIntoReference = function(nameOfObject){
  console.log(someUnknownCode(nameOfObject));
};

stringIntoReference('foo');  // logs an object: {key: 'value'}

Пример 2:

var referenceIntoString = function(nameOfObject){
  console.log(someUnknownCode(nameOfObject));
};

referenceIntoString(foo);  // logs a string: 'foo'

person Nathanael Ligon    schedule 08.09.2016    source источник
comment
1. возможно, 2 невозможно   -  person Jaromanda X    schedule 08.09.2016
comment
Если переменная находится в глобальной области видимости, вы можете попробовать this[nameOfObject], но это ужасная практика. Лучше просто создать еще 1 объект (в основном пространство имен) и хранить foo внутри него под ключом foo. Затем вы можете получить доступ к объектам по их именам (именам ключей).   -  person Azamantes    schedule 08.09.2016
comment
Спасибо за ответ, Асамантес. Я пытаюсь представить, как это будет выглядеть. Вы имеете в виду создать объект в функции? Можно, но я не уверен, как это позволит мне получить доступ к объекту «foo» только с помощью строки «foo».   -  person Nathanael Ligon    schedule 09.09.2016


Ответы (1)


Во-первых, eval поможет. Имейте в виду, что это опасно, потому что может запускать произвольный код.

var foo = {key: 'value'};
var stringIntoReference = function(nameOfObject){
  console.log(eval(nameOfObject));
};
stringIntoReference('foo'); // {key: 'value'}

Обратите внимание, что eval будет оценивать вашу ссылку в stringIntoReference, область действия которой может отличаться от места, где вы ее вызываете.

Второе точно не возможно. Разрешение идентификатора происходит до вызова, функция получает только результирующее значение. Что ж, вы можете использовать грязный трюк и захватить область действия с помощью оператора прокси with, но это не совсем то, что вам нужно.

var referenceIntoString = function(nameOfObject) {
  console.log(nameOfObject);
};
var p = new Proxy({}, {
  has: (_, prop) => prop !== "referenceIntoString",
  get: (_, prop) => prop,
});
with(p) {
  referenceIntoString(foo); // 'foo'
}

person Oriol    schedule 18.09.2016