[javascript] 함수를 반환하는 함수

나는 ‘함수를 반환하는 함수’라는 개념을 고수하고 있습니다. 저는 Stoyan Stefanov의 ‘Object Oriented Javascript’라는 책을 참조하고 있습니다.

스 니펫 1 :

    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b();
    }
    
    var s = a();
    alert('break');
    s();

산출:

A!
B!
break

스 니펫 2

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b;
}

var s = a();
alert('break');
s();

산출:

A!
break
B!

누군가 가 위의 스 니펫에서 반환 b과 차이를 말해 줄 수 있습니까 b()?



답변

함수에 변수를 할당하면 (괄호없이) 함수에 대한 참조가 복사됩니다. 함수 이름 끝에 괄호를 넣으면 함수를 호출하여 함수 반환 값을 반환합니다.

데모

function a() {
    alert('A');
}
//alerts 'A', returns undefined

function b() {
    alert('B');
    return a;
}
//alerts 'B', returns function a

function c() {
    alert('C');
    return a();
}
//alerts 'C', alerts 'A', returns undefined

alert("Function 'a' returns " + a());
alert("Function 'b' returns " + b());
alert("Function 'c' returns " + c());

귀하의 예에서는 함수 내에서 함수를 정의하고 있습니다. 예 :

function d() {
    function e() {
        alert('E');
    }
    return e;
}
d()();
//alerts 'E'

이 함수는 여전히 호출 가능합니다. 여전히 존재합니다. 이것은 JavaScript에서 항상 사용됩니다. 기능은 주위에 전달 될 수있는 단지 다른 값처럼. 다음을 고려하세요:

function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }
}
var count = counter();
count();
count();
count();

함수 개수는 외부에 정의 된 변수를 유지할 수 있습니다. 이것을 클로저라고합니다. JavaScript에서도 많이 사용됩니다.


답변

없이 함수 이름을 ()반환 하면 함수에 대한 참조가 반환되며 var s = a(). s이제 함수에 대한 참조가 포함 b()되며 호출 s()은 기능적으로 호출과 동일합니다 b().

// Return a reference to the function b().
// In your example, the reference is assigned to var s
return b;

()return 문에서 함수를 호출하면 함수가 실행되고 함수에서 반환 된 값이 반환됩니다. 호출과 비슷 var x = b();하지만 반환 값을 할당하는 대신 b()호출 함수에서 반환합니다 a(). 함수 b()자체가 값을 반환하지 않으면에서 undefined다른 작업을 수행 한 후 호출이 반환 됩니다 b().

// Execute function b() and return its value
return b();
// If b() has no return value, this is equivalent to calling b(), followed by
// return undefined;


답변

return b(); b () 함수를 호출하고 그 결과를 반환합니다.

return b; 나중에 호출하기 위해 변수에 저장할 수있는 함수 b에 대한 참조를 반환합니다.


답변

반환 b은 함수 객체를 반환하는 것입니다. 자바 스크립트에서 함수는 다른 객체와 마찬가지로 객체 일뿐입니다. 도움이되지 않는다면 “object”라는 단어를 “thing”으로 바꾸십시오. 함수에서 모든 객체를 반환 할 수 있습니다. 참 / 거짓 값을 반환 할 수 있습니다. 정수 (1,2,3,4 …). 문자열을 반환 할 수 있습니다. 여러 속성이있는 복잡한 개체를 반환 할 수 있습니다. 그리고 함수를 반환 할 수 있습니다. 기능은 단지 일입니다.

귀하의 경우, b반환은 사물을 반환하고 사물은 호출 가능한 함수입니다. 반환 b()은 호출 가능한 함수에서 반환 한 값을 반환합니다.

이 코드를 고려하십시오.

function b() {
   return 42;
}

위의 정의를 사용하여 return b();값 42를 반환합니다. 반면 return b;에 자체적으로 42 값을 반환하는 함수를 반환합니다. 두 가지 다른 것입니다.


답변

를 반환하면 b함수 b에 대한 참조 일뿐 현재 실행되지는 않습니다.

를 반환 b()하면 함수를 실행하고 그 값을 반환합니다.

시도 alert보내고 typeof(s)당신의 예에. 스 니펫 b는 ‘기능’을 제공합니다. 스 니펫은 무엇을 제공합니까?


답변

함수를 int와 같은 유형으로 상상해보십시오. 함수에서 int를 반환 할 수 있습니다. 함수도 반환 할 수 있으며 “함수”유형의 개체입니다.

이제 구문 문제 : 함수가 값을 반환하기 때문에 반환 값이 아닌 함수를 어떻게 반환 할 수 있습니까?

괄호를 생략하여! 괄호가 없으면 함수가 실행되지 않기 때문입니다! 그래서:

return b;

“함수”를 반환합니다 (숫자를 반환하는 것처럼 상상해보세요).

return b();

먼저 함수 실행 한 다음 실행하여 얻은 값 반환하는 것은 큰 차이입니다!


답변

변수 만들기 :

var thing1 = undefined;

함수 선언 :

function something1 () {
    return "Hi there, I'm number 1!";
}

(첫 번째 변수) 의 을 경고합니다 thing1.

alert(thing1); // Outputs: "undefined".

이제 함수에 thing1대한 참조가 되고 싶다면 something1, 생성 된 함수와 같은 일이 될 것입니다.

thing1 = something1;

그러나 함수 의 return 을 원한다면 실행 된 함수의 반환 값을 할당해야합니다. 괄호를 사용하여 함수를 실행합니다.

thing1 = something1(); // Value of thing1: "Hi there, I'm number 1!"