>  기사  >  웹 프론트엔드  >  JavaScript는 모듈성을 달성하기 위해 클로저를 사용합니다.

JavaScript는 모듈성을 달성하기 위해 클로저를 사용합니다.

高洛峰
高洛峰원래의
2017-01-20 11:20:311021검색

클로저의 힘을 활용하세요. 하지만 표면적으로는 콜백과 아무 관련이 없는 것 같습니다. 그중 가장 강력한 모듈인 모듈을 살펴보겠습니다.

function foo() {
  var something = "cool";
  var another = [1, 2, 3];
  function doSomething() {
    console.log( something );
  }
  function doAnother() {
    console.log( another.join( " ! " ) );
  }
}

이 코드에서 볼 수 있듯이 명확한 클로저가 없으며 두 개의 개인 데이터 변수인 Something과 Another, 그리고 doSomething() 및 doAnother()만 있습니다. 두 개의 내부 함수, 어휘 범위(그리고 이것이 클로저)는 foo()의 내부 범위입니다.

다음으로 다음 코드를 고려하세요.

function CoolModule() {
  var something = "cool";
  var another = [1, 2, 3];
  function doSomething() {
    alert( something );
  }
  function doAnother() {
    alert( another.join( " ! " ) );
  }
  return {
    doSomething: doSomething,
    doAnother: doAnother
  };
}
var foo = CoolModule();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3

이 패턴을 JavaScript에서는 모듈이라고 합니다. 모듈 패턴을 구현하는 가장 일반적인 방법은 종종 모듈 노출이라고 하며, 그 변형이 여기에 표시됩니다. 코드를 자세히 살펴보겠습니다.

우선 CoolModule()은 모듈 인스턴스를 생성하기 위해 호출해야 하는 함수일 뿐입니다. 외부 함수를 실행하지 않으면 내부 범위나 클로저를 생성할 수 없습니다. 둘째, CoolModule()은 객체 리터럴 구문 { key: value, ... }로 표시되는 객체를 반환합니다. 반환된 개체에는 내부 데이터 변수가 아닌 내부 함수에 대한 참조가 포함되어 있습니다. 우리는 내부 데이터 변수를 숨기고 비공개로 유지합니다. 이 객체 유형의 반환 값을 본질적으로 모듈의 공개 API로 생각할 수 있습니다. 이 객체 유형의 반환 값은 결국 외부 변수 foo에 할당된 다음 이를 사용하여 foo.doSomething()과 같은 API의 속성 메서드에 액세스할 수 있습니다.

모듈에서 실제 객체를 반환할 필요는 없으며 내부 함수를 직접 반환할 수도 있습니다. jQuery가 좋은 예입니다. jQuery와 $ 식별자는 jQuery 모듈의 공개 API이지만 그 자체가 함수입니다(함수도 객체이므로 속성 자체를 가질 수도 있습니다).

doSomething() 및 doAnother() 함수에는 모듈 인스턴스 내부의 범위를 포괄하는 클로저가 있습니다(CoolModule()을 호출하여 구현됨). 속성 참조가 포함된 객체를 반환하여 어휘 범위 외부의 함수를 전달할 때 클로저를 관찰하고 연습할 수 있는 조건을 만든 것입니다. 좀 더 간단하게 설명하자면, 모듈 패턴은 두 가지 필수 조건을 충족해야 합니다.

1. 적어도 한 번은 호출해야 하는 외부 엔클로징 함수가 있어야 합니다(각 호출은 새 모듈 인스턴스를 생성합니다).

2. 닫힌 함수는 내부 함수가 프라이빗 범위에서 클로저를 형성하고 프라이빗 상태에 액세스하거나 수정할 수 있도록 적어도 하나의 내부 함수를 반환해야 합니다.

기능적 속성을 가진 객체는 그 자체로 모듈이 아닙니다. 편리한 관찰 관점에서 보면 데이터 속성만 있고 클로저 함수는 없는 함수 호출에서 반환된 객체는 실제 모듈이 아닙니다. 이전 예제 코드에는 CoolModule()이라는 별도의 모듈 생성기가 있어 여러 번 호출할 수 있으며 호출할 때마다 새 모듈 인스턴스를 생성합니다. 인스턴스가 하나만 필요한 경우 이 패턴을 개선하여 싱글톤 패턴을 구현할 수 있습니다.

var foo = (function CoolModule() {
  var something = "cool";
  var another = [1, 2, 3];
  function doSomething() {
    alert( something );
  }
  function doAnother() {
    alert( another.join( " ! " ) );
  }
  return {
    doSomething: doSomething,
    doAnother: doAnother
  };
})();
foo.doSomething(); // cool
foo.doAnother(); // 1 ! 2 ! 3

이 함수를 즉시 호출하고 반환 값을 직접 할당합니다. 모듈 싱글톤에 주어진 인스턴스 식별자 foo입니다.

모듈도 일반 함수이므로 매개변수를 받을 수 있습니다.

function CoolModule(id) {
  function identify() {
    console.log( id );
  }
  return {
    identify: identify
  };
}
var foo1 = CoolModule( "foo 1" );
var foo2 = CoolModule( "foo 2" );
foo1.identify(); // "foo 1"
foo2.identify(); // "foo 2"

모듈 패턴의 또 다른 간단하지만 강력한 변형은 객체 이름을 지정하는 것입니다. 공개 API로 반환됨:

var foo = (function CoolModule(id) {
function change() {
  // 修改公共API
  publicAPI.identify = identify2;
}
function identify1() {
  alert( id );
}
function identify2() {
  alert( id.toUpperCase() );
}
var publicAPI = {
  change: change,
  identify: identify1
};
return publicAPI;
})( "foo module" );
foo.identify(); // foo module
foo.change();
foo.identify(); // FOO MODULE

모듈 인스턴스 내부의 공개 API 객체에 대한 내부 참조를 유지하여 모듈 인스턴스를 내부에서 수정할 수 있습니다. 또는 메서드와 속성을 제거하고 해당 값을 수정합니다.

위 내용은 이 글의 전체 내용입니다. 이 글의 내용이 모든 분들의 공부나 업무에 조금이나마 도움이 되었으면 좋겠습니다. 저도 PHP 중국어 홈페이지에 지원하고 싶습니다!

모듈화를 위해 클로저를 사용하는 JavaScript와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.