JavaScriptでネストされた関数を記述できますか?


116

JavaScriptが別の関数内の関数の記述をサポートしているか、ネストされた関数をサポートしているか(ブログでそれを読んでいます)。これは本当に可能ですか?実際、私はこれらを使用しましたが、この概念はわかりません。私はこれについて本当に不明確です-助けてください!

回答:


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
この方法はカレーと呼ばれます。
Yekver 2014年

このコードはこれと同等ですか?
アンオルティス

function a(x){// <-function return {calc:function(y){// <-inner function return x * y; // <-return x use variables from outer scope}}; 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 2016年

17

関数は、次のようなファーストクラスオブジェクトです。

  • 関数内で定義
  • 関数の任意の時点で他の変数またはオブジェクトと同じように作成されます
  • あなたの関数から返されました(上記の2つの後で明白に見えるかもしれませんが、それでも)

ケニーの例を基にするには:

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

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

5で警告します


5
この方法はカレーと呼ばれます。
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で使用します
jscripter '19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.