Nice programing

JavaScript에서 "클로저"는 정확히 무엇을 의미합니까?

nicepro 2020. 10. 30. 20:58
반응형

JavaScript에서 "클로저"는 정확히 무엇을 의미합니까?


나는 클로저가 무엇인지 이해하지만 그 용어가 무엇을 closure의미 하는지 정확히 파악하는 데 어려움 이 있습니다. 많은 웹 사이트에서 사용되는 용어를 보았지만 실제 정의에 거의 동의하지 않습니다.

  • 스택 프레임에 유지되는 변수입니까?
  • 반환되는 함수입니까?
  • 외부 기능의 범위입니까?
  • 내부 (반환 된) 함수의 범위입니까?
  • 함수를 반환 한 후 스택 프레임에 변수를 유지 하는 개념 일까요?

누군가가 무엇을 closure의미 하는지 정확히 말해 줄 수 있습니까 ?


에서 자바 스크립트 클로저

두 개의 한 문장 요약 :

클로저는 함수에 대한 지역 변수입니다. 함수가 반환 된 후에도 계속 유지됩니다.

클로저는 함수가 반환 될 때 할당 해제되지 않는 스택 프레임입니다. ( 'stack-frame'이 스택에있는 대신 malloc 된 것처럼!)

클로저에 대한 아주 좋은 기사

자바 스크립트 클로저

"클로저"는 해당 변수를 바인딩하는 (표현식을 "닫는") 환경과 함께 자유 변수를 가질 수있는 표현식 (일반적으로 함수)입니다.

Closure에 대한 간단한 설명은 ECMAScript가 내부 기능을 허용한다는 것입니다. 다른 함수의 함수 본문 내에있는 함수 정의 및 함수 식. 그리고 이러한 내부 함수는 외부 함수 내의 모든 지역 변수, 매개 변수 및 선언 된 내부 함수에 액세스 할 수 있습니다. 클로저는 내부 함수 중 하나가 포함 된 함수 외부에서 액세스 할 수 있도록 만들어 외부 함수가 반환 된 후에 실행될 수 있도록합니다. 어느 시점에서도 외부 함수의 지역 변수, 매개 변수 및 내부 함수 선언에 액세스 할 수 있습니다. 이러한 지역 변수, 매개 변수 및 함수 선언 (초기)에는 외부 함수가 반환 될 때 보유한 값이 있으며 내부 함수와 상호 작용할 수 있습니다.

여기에 좋은 예

JavaScript, 폐쇄 시간


다른 범위에있는 무언가에 대한 참조 또는 참조를 "보유"하는 함수입니다. 예를 들면 :

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent's scope, this creates a closure
    myArrayOfFunctions[i] = function(a) { return a + i;}    
}

myArrayOfFunctions[0](5);   //Prints 8 WTF!
myArrayOfFunctions[1](5);   //8 again
myArrayOfFunctions[2](5);   //Well, this 8 was expected

이것은 함수가 "생성"될 때 i의 값을 복사하지 않고 i에 대한 참조를 보유하기 때문에 발생합니다. 따라서 함수를 호출 할 때 i의 현재 값인 3을 사용합니다.

다음은 그래픽 설명입니다.


나를 위해 JS의 클로저를 사용하면 다음을 수행 할 수 있습니다.
"a"는 "b"에 추가 될 때 내부 함수에서 사용할 수 있지만 외부에 선언되어 있습니다.

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

JS 클로저를 극단적으로 사용 하려면 PURE 라이브러리 (JS 템플릿 엔진) 소스 코드살펴볼 수 있습니다.


내가 말할 수있는 한, 클로저는 부모 함수의 범위보다 오래 지속되는 다른 함수 내에 정의 된 함수입니다. 일반적인 예는 콜백입니다.

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

이 경우 위의 내용 function closure은의 본문 내에 정의되어 delay_message있지만 함수 정의 (부모 함수의 변수 msg포함)는 delay_message함수 호출 범위를 초과합니다 .


변수 a와 b를 사용하여 클로저를 생성하는 다음 코드를 고려하십시오.

closure=(function(){ 

    var a=3
    var b=5 

return  function(operation){ 
          return operation(a,b)
      }
 }())


// The variables a and b are now part of the closure (They are retained even after the outer function returns)


closure(function(x,y){return x+y})  // outputs 8

closure(function(x,y){return x*y}) // outputs 15`

이 특정 클로저는 이제 변수 a 및 b에서 작동하는 모든 함수를 사용할 수 있습니다.


기본적으로 클로저는 로컬 환경 내에서 식별자 (변수)에 대해 닫힌 함수 본문입니다.


A closure is a function value created from a nested function declaration or function expression (i.e. lambda expression) whose body contains one or more references to variables declared in an outer (but not global) scope.


Closure means a function(outer function) containing another function(inner function).

Closure is used to protect the data.

the use of closer is demostrated in the video link provide below:

https://www.youtube.com/watch?v=w1s9PgtEoJs

참고URL : https://stackoverflow.com/questions/1801957/what-exactly-does-closure-refer-to-in-javascript

반응형