好的,首先让我们看看一些代码:
<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
}
答案 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();
这应该被认为是低谷。