您可以用JavaScript编写嵌套函数吗?


116

我想知道JavaScript是否支持在另一个函数或嵌套函数(我在博客中读过)中编写一个函数。这真的有可能吗?实际上,我已经使用了这些,但是不确定这个概念。我真的不清楚-请帮助!

Answers:


197

这真的有可能吗?

是。

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));


23
此方法称为currying。
Yekver 2014年

这段代码与此等效吗?
安妮·奥尔蒂斯

函数a(x){// <-函数return {calc:function(y){// <-内部函数return x * y; // <-返回x使用外部作用域的变量}}; console.log(a(3)(4));
安妮·奥尔蒂斯

29

下面是令人讨厌的内容,但是它用来说明如何像对待其他任何类型的对象一样对待函数。

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

17

函数是一流的对象,可以是:

  • 在您的函数中定义
  • 与函数中任何其他位置的变量或对象一样创建
  • 从您的函数返回(在上面的两个函数之后似乎很明显,但仍然可以)

以肯尼给出的示例为基础:

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

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

会以5提醒您。


5
此方法称为currying。
Yekver 2014年

14

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

试试这个:

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

   }
}

11

您不仅可以将传递给另一个函数的函数作为变量返回,还可以在内部用于计算但在外部进行定义。请参阅以下示例:

    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

1
我与ajax
一起
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.