参数对应关系:回调与闭包(?)

Parameter correspondence: callback vs. closures (?)

本文关键字:闭包 回调 关系 参数      更新时间:2023-09-26

使用javascript闭包和回调,我对命名嵌套函数所采用的参数(从外部函数继承?)与闭包的参数之间的区别感到困惑。例如:

var filter = function (collection, test) {
    var newArray = [];
    each(collection, function (value) {
        if (test(value)) { 
            newArray.push(value);
        }
    });
    return newArray;
};

过滤器功能对每个功能进行操作。"值"参数(每个)对应的输入是什么?回调函数的参数是否会自动与过滤器的第一个参数对齐,因为它们都是各自函数的第一个变量?如果外部函数和内部函数都接受另一个参数,那么它们会因为位置而排列吗?这里的内部/外部函数之间的参数关系似乎与闭包的参数不同(闭包似乎接受了一个新参数;它的参数与外部函数的参数不一致)例如:

var outer = function(par1, par2) {
    var hold = par1 + par2;
    function inner(par3) {
       return par3 + par1 + par2;
    }
    return inner;
};
var closure = outer (5,4);
closure(2);

我看到内部函数是从外部函数返回的(当存储在另一个变量中时),并将自己的参数与外部函数分开。

命名/已建立的函数是否从其封闭函数继承其参数对应关系?

回调函数是否有自己的参数——与封闭函数分开——因为它们是从该函数中返回并保存到变量中的?

"值"参数(每个)对应的输入是什么?

这取决于each的作用。这不是一个标准的JS全局,你还没有分享你对它的定义

回调函数的参数是否会自动与过滤器的第一个参数对齐,因为它们都是各自函数的第一个变量?

没有。传递给任何函数的参数都取决于调用该函数的代码。

如果外部函数和内部函数都接受另一个参数,那么它们会因为位置而排列吗?

没有。

命名/已建立的函数是否从其封闭函数继承其参数对应关系?

没有。

回调函数是否有自己的参数-与封闭函数分开

因为它们是从该函数中返回并保存到变量中的?

没有。这是因为它们是函数。

function outer(foo, bar) {
  console.log("Outer gets foo " + foo + " because foo is a argument of outer");
  console.log("Outer gets bar " + bar + " because foo is a argument of outer");
  return inner;
  function inner(baz) {
    console.log("Inner gets foo " + foo + " because foo is a variable still in scope");
    console.log("Inner gets bar " + bar + " because bar is a variable still in scope");
    console.log("Inner gets baz " + baz + " because baz is an argument of inner");
  }
}
var returned_inner = outer(1, 2);
returned_inner(3);


对于javascript闭包和回调,我很困惑为什么一个命名的嵌套函数所采用的参数(从外部函数继承的?)与闭包的参数不同。

您的困惑问题源于一个简单的事实,即大多数时候,当您使用回调时,实际调用它的函数是由其他人编写的,而您从未查看过它

我想我可以总结所有问题的答案,说绝对没有要求内部函数的参数与封闭函数的参数有任何关系。

它们是完全不相关的价值观。

例如:

function f(a, b, c, d, e) {
    // You mentioned "named, nested" function in your question...
    return function unusedName(x) {return x}
}
console.log(f(1, 2, 3, "four", 25/5)(100));

将显示100。

当然,在现实中,您会希望内部函数以某种方式或其他方式使用外部函数的参数,否则外部函数的这些参数是无用的。

但并不要求它们"对齐"。如何创建闭包,即返回的内部函数如何决定使用外部函数提供的环境中的值,完全取决于您。语言本身没有强制执行任何内容。

请考虑更改问题中的大多数假设:-)

标识符范围

当javascript代码在函数内部使用未修饰的标识符(如变量名、对象名或函数名)时,javascript引擎会查看该标识符是局部变量的名称、在同一函数体中定义的嵌套函数的名称还是形式参数的名称。如果没有找到,它将以相同的方式在下一个最外部的函数中搜索标识符(如果搜索的函数是嵌套的),或者如果上一个搜索的函数本身是全局的,则在全局范围中查找标识符。

因此;排队";对于嵌套函数参数,只需要搜索作用域链。外部函数参数、变量和命名函数定义都在内部函数的范围内。没有自动的";关系";在不同函数中的形式参数定义之间,除非程序员有计划。

关闭

要小心将函数分类为回调闭包。回调函数通常形成一个闭包。总之,闭包是由于在嵌套函数的外部函数返回后保留对该函数的引用而导致的。这可能是由于在外部函数返回之前或之后存储对内部函数的引用,或者通过将对内部功能的引用传递给其他函数以用作异步回调。只要对内部函数的引用被保存在某个地方,它在其作用域链中引用的任何值都不能用于垃圾收集,因为它们是可访问的。

for Each

each函数似乎是应用于作为参数传递的集合的迭代器函数。Javascript支持标准化的forEach来迭代Array、Map和Set对象。有关如何调用和回调回调函数的更多详细信息,请参阅文档。