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

이 코드가이 코드와 동일합니까?
Anne Ortiz

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

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 2010

5
객체처럼 그 기능을 치료 그들은이다
알렉스 Lomia

17

함수는 다음과 같은 일류 객체입니다.

  • 함수 내에서 정의
  • 함수의 어느 지점에서나 다른 변수 또는 객체처럼 생성됩니다.
  • 함수에서 반환 됨 (위의 두 가지 후에 분명해 보일 수 있지만 여전히)

Kenny가 제공 한 예제를 기반으로 작성하려면 다음을 수행하십시오.

   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
나는 아약스와 그것을 사용
jscripter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.