通行证;额外的;存储在变量中的函数的参数-Javascript
我是Javascript新手,我在自学,所以这可能是一个显而易见的领域,但无论我如何表达这个问题,我似乎都无法真正理解这个问题。目前,我正在通读(这是在mozilla的MDN上)。我已经遇到过几次了,如果可能的话,我只想简单地分解一下通行证;额外的;存储在变量中的函数的参数-Javascript,javascript,Javascript,我是Javascript新手,我在自学,所以这可能是一个显而易见的领域,但无论我如何表达这个问题,我似乎都无法真正理解这个问题。目前,我正在通读(这是在mozilla的MDN上)。我已经遇到过几次了,如果可能的话,我只想简单地分解一下 function negate(func) { return function(x) { return !func(x); }; } var isNotNaN = negate(isNaN); show(isNotNaN(NaN)); 我不明白在
function negate(func) {
return function(x) {
return !func(x);
};
}
var isNotNaN = negate(isNaN);
show(isNotNaN(NaN));
我不明白在最后一步isNotNaN(变量)是如何向isNotNaN(否定(isNaN))中存储的函数传递“额外参数”(NaN)。“show(isNotNaN(NaN));”
在解释封闭的概念时,我遇到了同样的问题。但我不明白上述函数中的参数“NaN”是怎么回事,因为在我看来,最后一条语句的结尾类似于:
show(negate(isNaN, NaN));
我很乐意提供更多细节。这种将额外参数传递给已经拥有参数函数的变量的概念让我感到非常困惑。事实上,
否定(isNaN)
只需将函数返回给变量isNotNaN
。此函数接受一个参数(在您的例子中名为x
),然后对参数执行函数isNaN
,然后对其求反并返回结果。也许此示例可以为您澄清有关闭包的一些问题:
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
没有“额外”参数。negate()
函数本身返回一个定义为函数表达式的函数,然后可以通过传递任意数量的原始(非额外)参数来调用该函数。isNaN
作为func
保留对该函数的引用
var isNotNaN = negate(isNaN);
此时,isNotNaN
包含对函数的引用
function(x) {
return !func(x);
};
同样,func
这里指的是传递给negate
函数的isNaN
参数,该函数是作用域链中的直接父函数。结果类似,但与
var isNotNaN = function (x) {
return !isNaN(x);
};
不同的原因是,如果我们更改isNaN
的值,此函数的行为将发生变化。但是,在您发布的示例中,func
的值等于isNaN
的原始值,并且由于闭包,无法在其范围之外进行任何更改
本质上,您可以传入任何函数并获得一个新函数,该函数返回原始函数的求反结果。例如:
var isNotArray = negate(Array.isArray);
isNotArray(12);
//-> true
“在我看来,最后一条语句的结尾是:
show(negate(isNaN,NaN));
”。我想说的是show(negate(isNaN)(NaN))
。这不是传递额外参数的问题,而是将它们传递给不同的闭包。太好了!当你说isNotNaN的计算结果为(非常类似于)封闭函数。@Johan也帮助了他的foobar函数,但是我看到在Johans的final语句中,他似乎没有通过fooRef为参数赋值,而是将两个独立的参数直接赋值给foo:“foo(1)(2)”在他的示例中,我假定1赋值给(x)2赋值给(y)?如果这是正确的,这不是比把foo(1)赋值给fooRef然后把(2)赋值给fooRef更好的方法吗?还是我缺少了一些闭包?@Bluey:你好像刚刚得到它:-)这两种方法都不一定更好,它们都具有相同的效果。您可以说,将foo(1)
的返回值赋值给fooRef
更具可读性,尤其是在foo()
可能需要大量参数或函数本身作为参数的情况下。