如何在同名函数中将参数传递给内部函数?

3

我是JavaScript的初学者,正在通过Freecodecamp学习。以下是我在学习高阶箭头函数时遇到的一个脚本。 我无法完全理解它,下面的示例中是否有两个同名的函数?参数是在哪里传递的?在内部函数还是外部函数中? 如果答案是外部函数,那么怎么可能呢?因为外部函数似乎没有接受任何参数。

const increment = (function(){
    return function increment(number, value){
        return number + value;
    };
})();
console.log(increment(5,2));

3
“高阶箭头函数”在哪里?你的例子中有两个函数表达式,外部函数是匿名的,内部函数是命名的。命名函数表达式的名称仅在该函数内部可见。您的代码将IIFE的结果分配给increment变量(即在IIFE中定义的函数),当您在console.log中调用该函数时,您还传递了参数。 - Teemu
我对箭头函数有同样的问题,但是FreeCodeCamp教程中的导师在这个视频中建议我们在2:53.04编写高阶箭头函数。 https://youtu.be/PkZNo7MFNFg?t=10384 - Vahid Kamyab
3个回答

3

increment 常量所分配的函数被包装在 IIFE(立即调用函数表达式)中。这意味着该函数会立即被调用和执行,正如其名称所示。然后它将返回对在 IIFE 中声明的函数的引用。

const increment = (function(){
  return function increment(number, value){
    return number + value;
  };
})();

这个结果和这个是一样的:
const increment = function increment(number, value){
  return number + value;
};

这是一个命名的函数表达式。如果按照这种模式,变量和函数都允许使用相同的名称。请尝试在控制台中像第二个代码块一样定义它。

区别在于变量increment只是对函数increment的引用。

但是在您的情况下,function increment是在匿名函数范围内定义的。因此,increment函数名称仅在该匿名函数的范围内可用。然后返回对increment函数的引用。

虽然IIFE可以省略,因为它没有做任何不同的事情。但是,如果您想隐藏一些变量,则可以通过闭包来增加一些价值,例如:

const increment = (function(){
  const hiddenValue = 2;
  return function increment(number, value){
    return number + value + hiddenValue;
  };
})();

现在每次调用increment函数时,hiddenValue的值将被加到计算公式中。这样你就可以创建一种全局变量,它存在于IIFE的作用域中,不会污染你真正的全局作用域。


1
还有一些小问题。IIFE内部的函数没有声明,它仍然是一个函数表达式。此外,increment function name 仅在该函数本身中可用,无论是否返回(尽管在代码中这有点难以理解,因为分配给函数的变量具有相同的名称)。这只是声明函数和命名函数表达式之间的差异之一。 - Teemu
1
“increment”函数名称仅在该匿名函数的范围内可用,这仍然只是一个命名函数表达式,没有变量声明。结果与没有IIFE完全相同。 - Bergi
感谢你们的反馈,先生们。如果还有需要修改的,请告诉我。我也会从中学习。 - Emiel Zuurbier
该死,我需要那个来解决面试前的挑战。 - Adam Ri

1
return function increment(number, value){
    return number + value;
};

在上面的代码中,函数名并不重要,删除它也不会改变什么。 唯一对外部世界有影响的是常量名。 这里是伪代码:
const increment = (anonymous func (return a func)) (self call);

没有左侧赋值,执行后所有内容都会丢失。

1
你可以将两个函数嵌套在一起,然后在主函数内调用该函数,但在另一个函数外部调用。
function firstOne(){
  console.log('first function is working.')
  function secondOne(){
    console.log('second function is working')
  }secondOne();
}firstOne() 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接