2010-07-09 91 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(){ 

    } 
} 
相關問題