Прежде всего & mdash; странный вопрос. много помогло бы узнать контекст, по которому вы спрашиваете, потому что, очевидно, Javascript не имеет точно того, о чем вы спрашиваете. (Например, это как-то конкретно связано с математическими выражениями? Должно ли выражение выполняться перед вызовом функции, как в вашем примере?)
Javascript не имеет:
- именованные параметры
- первоклассные / динамические выражения
Javascript имеет имеет:
- динамические объекты
- первоклассные функции
- закрытие
eval
Динамические объекты
Поскольку это был ваш собственный заявленный вариант в конце, который вы объявили неприемлемым, похоже, он вам мало поможет. В любом случае, поскольку вы хотите, чтобы выражения и представляли значения, простая передача только одного объекта значений вам не поможет.
Первоклассные функции
Как вы сказали, у вас есть доступ к Function.caller
, хотя это просто выводит строковое представление всей функции. Это также нестандартно.
У вас также есть arguments
, который является массивом аргументов, которые были переданы, без имени. В случае вашего существующего кода, очевидно, это будет выполненный результат выражения. Одним из удобных вариантов использования arguments
является не указание каких-либо параметров в сигнатуре функции, а затем повторение массива в виде открытого списка.
Затворы
Это также часть вашего неприемлемого решения в конце, но, возможно, может быть наиболее близким к рабочему решению для вас, хотя вам придется проявить гибкость в том, как bar
называется или где это определено.
function foo() {
var a = 3;
var b = "hello";
var c = [0,4];
var bar = function(arg) {
alert(arg); // NaN
alert(a + " " + b + " " + c); //will alert "3 hello 0,4"
}
bar(a - b / c);
bar(c * a + b);
}
Eval
Используя eval и замыкания, вы можете приблизиться к тому, что хотите.
Главное, что нужно помнить, это то, что в вашем коде a - b / c
является выражением. То есть не аргумент, результат выражения - аргумент . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1069
С eval
( Отказ от ответственности: это очень глупо и не рекомендуется! Вас предупредили. ), вы могли бы фактически передать String в качестве аргумента и использовать закрытие, которое привязано к пространству, предупредите, что вы хотите.
function foo() {
var a = 3;
var b = "hello";
var c = [0,4];
function hackyUglyEvalAndOutput(callback, expression) {
alert(expression); //will alert "a - b / c" (duh)
alert(a + " " + b + " " + c); //will alert "3 hello 0,4" (because of the closure)
callback(eval(expression)); // "NaN"
}
hackyUglyEvalAndOutput(bar, "a - b / c");
hackyUglyEvalAndOutput(bar, "c * a + b");
}
function bar(arg) { alert(arg); }
Вы можете аналогичным образом разобрать caller
, чтобы найти вызовы функции и посмотреть, что было передано в список аргументов (я сделал это, чтобы сделать это) , но у вас не будет никакого способа отличить, какой из них сделал вызов если существует более одного . По вашему примеру, это было бы крайне важно для достижения того, что вы хотите сделать.
Снова & mdash; выражения - только это и больше ничего; они не аргументы.
P.S. Второй вызов bar
фактически выдаст NaNhello
:)