确定封装的javascript函数参数的值

时间:2010-10-06 13:19:11

标签: javascript closures

好的,首先让我们看看一些代码:

<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”,“是“等等?”

编辑:

好吧,我可以看到找到这些价值确实是不可能的。唯一的方法是,如果我可以访问匿名函数的'arguments'属性,但唉,这也是不可能的。我的工作是要求一个Function类型的Object作为参数。这仍有一些问题,我可以在下面的新代码中看到,但这应该适用于我的情况。谢谢大家!

<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 个答案:

答案 0 :(得分:1)

在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();

这应该被认为是低谷。