Определить значение параметров инкапсулированной функции javascript - PullRequest
1 голос
/ 06 октября 2010

Хорошо, для начала давайте рассмотрим некоторый код:

<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
}

1 Ответ

1 голос
/ 06 октября 2010

В случае num:

num является глобальным свойством.Если у вас есть это знание (что это глобальное свойство), то вы знаете, что вы можете получить к нему доступ следующим образом:

window.num

В случае y:

y - это свойствоэто находится в цепочке областей действия функции, которая была создана путем выполнения adder (5).Эта функция имеет доступ к значению y, но код вне этой функции не имеет доступа к нему.

var closureFunction = adder(5);

Функция closureFunction имеет свойство y в своей цепочке областей действия, и если вы запустите эту функцию, значение y будет добавлено к переданному аргументу.Однако, если вы реорганизуете свой код, вы можете включить получение значения y.

Ваш код:

var adder = function(y) {
    return function(x) { 
        return x + y;
    };
};

Рефакторизованный код:

var adder = function(y) {
    var fn = function(x) { 
        return x + y;
    };
    fn.getArgument = function() { return y; };
    return fn;
};

Теперь выможно получить вот так:

closureFunction.getArgument();

Это следует подумать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...