Хорошо, для начала давайте рассмотрим некоторый код:
<html>
<body>
<script type="text/javascript">
function logFunction(fn) {
console.log(fn.prototype);
console.log(fn);
console.log(fn(4));
}
var num = 5;
var add5 = function(x) { return x + 5 };
var addNum = function(x) { return x + num };
var adder = function(y) { return function(x) { return x + y } };
logFunction(add5);
logFunction(addNum);
logFunction(adder(5));
</script>
</body>
</html>
При выполнении он возвращает следующие результаты:
Object
constructor: function (x) { return x + 5 }
__proto__: Object
function (x) { return x + 5 }
9
Object
constructor: function (x) { return x + num }
__proto__: Object
function (x) { return x + num }
9
Object
constructor: function (x) { return x + y }
__proto__: Object
function (x) { return x + y }
9
Хотя это было бы очень легко в первомВ случае, чтобы увидеть, что значение, к которому будет добавлено значение x, равно 5, я не могу придумать способ сделать то же самое в двух других случаях.
Мой вопрос таков: есть ли способопределить значение того, к чему x добавляется в последних двух примерах, вооружившись только ссылкой на функцию и знанием того, как называется переменная («num», «y» и т. д.)?
EDIT:
Хорошо, я вижу, что найти эти значения действительно невозможно.Единственный способ был бы, если бы у меня был доступ к свойству «arguments» анонимной функции, но, увы, это тоже невозможно.Моя работа заключается в том, чтобы потребовать в качестве параметра объект типа Function.С этим все еще есть некоторые проблемы, как видно из моего нового кода ниже, но это должно работать для моего случая.Спасибо всем!
<html>
<body>
<script type="text/javascript">
function logFunction(fn) {
console.log(fn.prototype);
console.log(fn);
console.log(fn(4));
console.log("");
console.log("");
}
var num = 5;
var addNumFunc = new Function("x", "return x + " + num);
var whereNumFunc = new Function("x", "return x >= " + num * num);
var adderFunc = new Function("y", "return function(x) { return x + y }");
var adderFuncFunc = new Function("y", "return new Function(\"x\", \"return x + \" + y)");
logFunction(addNumFunc);
logFunction(whereNumFunc);
logFunction(adderFunc);
logFunction(adderFunc(5));
logFunction(adderFuncFunc);
logFunction(adderFuncFunc(5));
</script>
</body>
</html>
Что возвращает:
anonymous
function anonymous(x) {
return x + 5
}
9
anonymous
function anonymous(x) {
return x >= 25
}
false
anonymous
function anonymous(y) {
return function(x) { return x + y }
}
function (x) { return x + y }
Object
function (x) { return x + y }
9
anonymous
function anonymous(y) {
return new Function("x", "return x + " + y)
}
function anonymous(x) {
return x + 4
}
anonymous
function anonymous(x) {
return x + 5
}