2010-07-09 52 views
71

我在想,如果JavaScript支持在另一个函数中编写函数,或者嵌套函数(我在博客中读过它)。这真的有可能吗?事实上,我已经使用过这些,但我不确定这个概念。我真的不清楚这一点 - 请帮助!你可以在JavaScript中编写嵌套函数吗?

回答

142

这是真的有可能。

是的。

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

+11

这种方法称为currying。 – Yekver 2014-11-29 21:45:41

+29

喔!看到这个后我需要镇静剂! – 2015-02-18 22:52:30

24

下面是讨厌的,但用来演示如何处理像任何其他类型的对象的功能。

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(); 
+3

很好的例子。我会补充一点,注意在其他函数中定义的函数只存在于该函数的作用域中是很重要的(当然,除非你为它分配一个全局函数,就像这个例子一样)。 – 2010-07-09 12:27:26

+2

将这些函数当作对象使用 – 2016-03-13 03:07:50

11

函数是第一类对象,可以是:

  • 你的函数
  • 创建就像在你的功能
  • 任何一点的任何其他变量或对象中定义
  • 从你的函数返回(这可能看起来很明显,但仍然)

要建立由肯尼给出的例子:

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

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

将提醒您5

+2

这种方法被称为currying。 – Yekver 2014-11-29 21:43:59

7

不仅可以退货,你已经通过另外一个函数作为变量的函数,您也可以将其用于内部计算,但在外部进行定义。看到这个例子:

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 – jscripter 2015-06-19 00:59:56

9

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

试试这个:

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

    } 
} 
相关问题