你能在JavaScript中编写嵌套函数吗?

139
我想知道JavaScript是否支持在另一个函数内编写函数,或者嵌套函数(我在一篇博客中读到过)。这真的可能吗?实际上,我已经使用过这些,但对这个概念不确定。我对此非常不清楚--请帮帮我!
8个回答

233

这真的可能吗。

是的。

function a(x) {    // <-- function
  function b(y) { // <-- inner function
    return x + y; // <-- use variables from outer scope
  }
  return b;       // <-- you can even return a function.
}
console.log(a(3)(4));


38
这种方法被称为柯里化。 - Yekver
函数是一种对象吗?抱歉打扰了。 - CiY3
@CiY3 他们是通过MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions)得知的:“在JavaScript中,函数是一等对象,因为它们可以像任何其他对象一样具有属性和方法。区别它们与其他对象的是函数可以被调用。简而言之,它们是“Function”对象。” - zcoop98

34
以下内容看起来很不好,但可以用来演示如何将函数视为任何其他类型的对象。
var foo = function () { alert('default function'); }

function pickAFunction(a_or_b) {
    var funcs = {
        a: function () {
            alert('a');
        },
        b: function () {
            alert('b');
        }
    };
    foo = funcs[a_or_b];
}

foo();
pickAFunction('a');
foo();
pickAFunction('b');
foo();

4
很好的例子。我想补充一点,需要注意的是在一个函数内定义的函数只存在于该函数的作用域内(当然,如果像这个例子中一样将其分配给全局函数,则除外)。 - Mike Sherov
5
把那些函数视为对象对待。 - Alex Lomia
为什么它那么讨厌呢?看起来它可以成为 switch case 的有用替代品。 - Jonathan Laliberte

21

函数是一等对象,可以:

  • 在函数内定义
  • 像其他变量或对象一样在函数的任何位置创建
  • 从函数中返回(在上述两个后者后看起来很显然,但仍需说明)

以Kenny给出的示例为基础:

   function a(x) {
      var w = function b(y) {
        return x + y;
      }
      return w;
   };

   var returnedFunction = a(3);
   alert(returnedFunction(2));

会用警报以5的数字提醒您。


6
这种方法被称为柯里化。 - Yekver

16

是的,可以编写并调用嵌套在另一个函数中的函数。

尝试这样做:

function A(){
   B(); //call should be B();
   function B(){

   }
}

12

不仅可以将作为变量传入另一个函数的函数返回,还可以在函数外定义它并在内部进行计算。请看以下示例:

    function calculate(a,b,fn) {
      var c = a * 3 + b + fn(a,b);
      return  c;
    }

    function sum(a,b) {
      return a+b;
    }

    function product(a,b) {
      return a*b;
    }

    document.write(calculate (10,20,sum)); //80
    document.write(calculate (10,20,product)); //250

5

使用ES6的另一种解决方案:

const currying = (x) => (y) => x + y;
console.log(currying(5)(3));

将会在控制台中打印:8


1
这是一篇很棒的文章,解释了为什么它被称为“柯里化”,可以在这里找到 https://javascript.info/currying-partials#currying-what-for - Andre

0
function calculate(num1) {
   // arrow function
   return (num2) => num1 + num2;
}

// Invoke the function
console.log(calculate(4)(6));

0
这真的可能吗?
非常可能。由于JavaScript是一种一等函数编程语言,您可以使用函数实现任何功能。

function add(x, y) {
  // we can define another function inside the add function to print our answer
  function print(ans) {
     console.log(ans)
  }
  const ans = x + y
  print(ans)
  return ans
}

add(1, 2)


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