我是Javascript的新手,我是自学的,所以这可能是一个显而易见的领域,但无论我怎么说这个问题,我似乎都无法理解这个问题。目前我正在阅读http://eloquentjavascript.net/chapter6.html(在Mozilla的MDN上)。我现在已经遇到过这种情况,如果可能的话,我只想简单地分解一下。
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
我不明白在最后一步isNotNaN(变量)是如何将'额外参数'(NaN)传递给存储在isNotNaN中的函数(否定(isNaN)。“show(isNotNaN(NaN)); “
当试图解释外壳的概念时,我遇到了同样的问题。但是我在上面的函数中没有得到这个参数“NaN” 的地方,因为在我看来,最后的语句最终结果如下:
show(negate(isNaN, NaN));
我很乐意提供更多细节。将一个额外的参数传递给一个已经持有带参数的函数的变量的概念让我感到困惑!
答案 0 :(得分:3)
没有“额外”的论点。 negate()
函数本身返回一个定义为函数表达式的函数,然后可以使用任意数量的原始(不是额外)参数调用它。闭包用于返回的函数,以将对isNaN
的引用保持为func
。
var isNotNaN = negate(isNaN);
此时,isNotNaN
包含对函数的引用
function(x) {
return !func(x);
};
同样,func
在这里指的是传递给isNaN
函数的negate
参数,该函数是作用域链中的直接父级。结果与
var isNotNaN = function (x) {
return !isNaN(x);
};
它不相同的原因是,如果我们更改isNaN
的值,此函数的行为将会改变。但是,在您发布的示例中,func
的值等于isNaN
的原始值,并且由于关闭,因此无法通过其范围之外的任何内容进行更改。
本质上,您可以传入任何函数并获取一个新函数,该函数返回原始函数的否定结果。例如:
var isNotArray = negate(Array.isArray);
isNotArray(12);
//-> true
答案 1 :(得分:0)
实际上,negate(isNaN)
只是将函数返回给变量isNotNaN
。此函数接受一个参数(在您的情况下名为x
),然后在取消参数并返回结果之前对参数执行函数isNaN
。
答案 2 :(得分:0)
也许这个例子可以为你清楚一些关于闭包的事情:
function foo(x){
function bar(y){
return x+y;
}
return bar;
}
var fooRef = foo(1); // fooRef references foo() with x set to 1
console.log(fooRef(2), foo(1)(2)); // 3, 3