나는 ‘함수를 반환하는 함수’라는 개념을 고수하고 있습니다. 저는 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!"