일부 Javascript 라이브러리에서 이 쓰기 스타일을 볼 수 있습니다.
( function(){
//모든 라이브러리 코드 코드
})();
솔직히 말하면 js 초보자입니다. 이건 정말 무서운 일입니다. 이 JS 라이브러리에서는 기본적으로 이 함수가 전체 라이브러리의 모든 코드를 포함합니다. 이런 방식은 제 상식을 완전히 뛰어넘습니다. 세심하게 나누어야 하지 않겠습니까? 레벨과 기능의 구분을 반영해야 하지 않겠습니까? 하나의 기능으로 어떻게 할 수 있습니까? 처음에는 감히 그것에 대해 전혀 생각하지 못했습니다. 한동안 JS를 사용하고 나서야 동료가 캐주얼 채팅에서 이 문제를 언급한 후에야 나는 이것이 익명 함수라고 불리는 것임을 알았습니다. 저는 C#, Python 및 Lua에서 사용할 수 있는 익명 함수에 대해 잘 알고 있습니다. 온라인으로 확인해 보니 아주 상세한 소개글이 많이 있었는데, 마음속 질문은 '왜 이렇게 써야 하지?'라는 답이 나오지 않았습니다.
잘 알려진 JS 오픈소스 라이브러리인 JQuery를 찾았는데, 그 코드는 위에서 언급한 전형적인 작성 방법입니다. 그의 코드를 대략적으로 살펴본 결과 이 코드는 너무 크고 복잡하며 실제로는 그렇지 않습니다. 나에게 적합합니다. 그래서 저는 Flash 컨트롤을 웹 페이지에 삽입하는 간단한 인터페이스를 제공하는 또 다른 오픈 소스 js 라이브러리인 swfobject를 선택했습니다. 이 코드는 훨씬 더 좋고 매우 짧으며 빠르게 읽을 수 있습니다. 그것을 읽은 후 갑자기 이것이 사실이라는 것을 깨달았습니다. 진실은 너무나 간단하며, 이렇게 쓴 이유는 단 하나의 목적, 즉 캡슐화를 위해서입니다.
처음 JS를 배울 때 동료들에게 JS에서 비공개 함수와 변수를 정의하는 방법을 물었습니다. 그때 제가 얻은 대답은 'js는 객체지향적이지 않고 이런 기능을 제공하지 않는다'였습니다. 나는 이 답변을 침착하게 받아들였습니다. 결국 엄격한 캡슐화는 필요하지 않습니다. 이제 마침내 방법은 항상 있다는 것과 캡슐화를 지원하지 않는 언어에서도 캡슐화가 가능하다는 것을 이해하게 되었습니다. 이를 달성하는 방법은 익명 함수를 사용하는 것입니다. 코드를 살펴보겠습니다.
/ /
함수 F(x) 정의
{
this.x = x
function double(x){return x*x;}
this.getDoubleX(){
return double(this.x );
}
}
//
f = new F(12)
alert(f.getDoubleX()); 🎜>
위의 코드는 매우 간단해서 직접 실행해보지는 않았습니다. JS에 대해 조금 아는 사람이라면 이것이 JS 클래스가 정의되는 방식이라는 것을 알고 있습니다. 함수 F는 생성자와 동일하며 함수의 다른 정의는 비공개이며 double 함수와 같이 외부에서 액세스할 수 없습니다. 이런 식으로 private 메소드가 위장하여 구현됩니다. "this"라는 접두사가 붙은 다른 멤버는 공개 멤버와 동일하며 외부에서 액세스할 수 있습니다.
이러한 라이브러리가 전체 라이브러리 코드를 큰 함수로 래핑하는 이유는 내부 메서드와 변수를 사용자에게 노출하지 않고 사용자가 개방형 API에만 액세스하도록 하기 위함입니다. 이를 통해 우리는 이들 개발자의 좋은 의도를 볼 수 있습니다.
이 시점에서 js는 상속을 어떻게 구현하는지 다시 묻지 않을 수 없습니다. 이번에는 지난번과 같은 대답이 아니기를 바랍니다. 지원하지 않습니다.