차이점은 다음과 같습니다. 1. JavaScript의 클로저는 실제로 함수 내부에 정의된 함수입니다(자식 함수이므로 상위 함수의 내부 변수를 읽을 수 있음). 2. Java의 클로저는 메서드를 변수로 사용할 수 있습니다. store, 이 메소드는 클래스의 자유 변수에 접근할 수 있는 능력을 가지고 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.
1. Javascript의 클로저:
1. 변수의 범위
클로저를 이해하려면 먼저 Javascript의 특수 변수 범위를 이해해야 합니다.
변수 범위에는 전역 변수와 지역 변수라는 두 가지 유형이 있습니다.
Javascript 언어의 특별한 점은 전역 변수를 함수 내부에서 직접 읽을 수 있다는 것입니다.
var n=999; function f1(){ alert(n); } f1(); // 999
반면, 함수 내의 지역 변수는 함수 외부에서 읽을 수 없습니다.
function f1(){ var n=999; } alert(n); // error
여기서 주의할 점이 하나 있습니다. 함수 내부에서 변수를 선언할 때는 var 명령을 사용해야 합니다. 사용하지 않으면 실제로 전역 변수를 선언하는 것입니다!
function f1(){ n=999; } f1(); alert(n); // 999
2. 외부에서 지역 변수를 읽는 방법
여러 가지 이유로 함수 내에서 지역 변수를 가져와야 하는 경우가 있습니다. 그러나 앞서 언급한 것처럼 이는 일반적인 상황에서는 불가능하며 해결 방법을 통해서만 가능합니다.
함수 안에 함수를 정의하는 것입니다.
function f1(){ n=999; function f2(){ alert(n); // 999 } }
f2는 f1의 지역 변수를 읽을 수 있으므로 f2가 반환 값으로 사용되는 한 f1 외부의 내부 변수를 읽을 수는 없나요?
function f1(){ n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
3. 폐쇄의 개념
위의 f2 함수는 클로저입니다. 클로저는 실제로 함수 내부에 정의된 함수입니다(자식 함수이기 때문에 상위 함수의 내부 변수를 읽을 수 있습니다).
본질적으로 클로저는 함수 내부와 함수 외부를 연결하는 다리입니다.
4. 클로저의 목적
1. 함수 내부에서 변수를 읽을 수 있습니다.
2. 이 변수(클로저에서 참조하는 변수)의 값은 항상 메모리에 남아있게 합니다.
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
이 코드에서 결과는 실제로 클로저 f2 함수입니다. 두 번 실행했는데, 처음에는 값이 999였고, 두 번째에는 값이 1000이었습니다. 이는 함수 f1의 지역 변수 n이 항상 메모리에 저장되며 f1이 호출된 후에 자동으로 지워지지 않음을 증명합니다.
왜 이런 일이 일어나는 걸까요? 그 이유는 f1이 f2의 상위 함수이고 f2가 전역 변수에 할당되어 f2가 항상 메모리에 있고 f2의 존재가 f1에 따라 달라지므로 f1은 항상 메모리에 있고 삭제되지 않기 때문입니다. 호출이 완료된 후 가비지 수집 메커니즘(가비지 수집)에 의해 재활용됩니다.
이 코드에서 주목할만한 또 다른 점은 "nAdd=function(){n+=1}"입니다. 우선 nAdd 이전에는 var 키워드가 사용되지 않으므로 nAdd는 로컬 변수가 아닙니다. 둘째, nAdd의 값은 익명 함수이고 익명 함수 자체도 클로저이므로 nAdd는 함수 외부에서 함수 내부의 지역 변수에 대해 연산을 수행할 수 있는 setter와 동일합니다.
5. 클로저 사용 시 주의사항
1. 클로저를 사용하면 함수의 변수가 메모리에 저장되므로 메모리 소모가 매우 크기 때문에 클로저를 남용할 수 없습니다.
2. 클로저는 부모 함수 외부에서 부모 함수 내부의 변수 값을 변경합니다.
6. 클로저 적용 시나리오
1. 함수 내 변수를 보호합니다. 초기 예를 들어, 함수 a의 i는 함수 b를 통해서만 접근할 수 있고 다른 수단으로는 접근할 수 없으므로 i의 보안이 보호됩니다.
2. 메모리에 변수를 유지합니다. 이전 예제와 마찬가지로 클로저로 인해 함수 a의 i는 항상 메모리에 존재하므로 c()가 실행될 때마다 i는 1씩 증가합니다.
2. Java에서의 클로저
1 Java에서의 클로저 정의
정의: 클로저는 메소드를 변수로 저장할 수 있습니다. 이 메소드는 클래스의 자유 변수에 액세스할 수 있습니다.
Java 언어 자체는 공식적으로 클로저를 지원하지 않지만 클로저(내부 클래스 + 인터페이스) 시뮬레이션을 허용합니다. 익명의 내부 클래스를 사용하여 클로저를 구현할 수 있습니다.
이 일반 객체가 해당 클래스의 자유 변수에 액세스하도록 허용하는 방법은 무엇입니까? 내부 수업. 내부 클래스는 외부 클래스의 모든 속성과 메서드에 액세스할 수 있습니다.
특정 구현을 숨기는 것은 내부 클래스의 기능 중 하나입니다. 클로저를 외부 사용으로 전달하면서 특정 구현을 숨기는 방법은 무엇입니까? 내부 클래스가 공통 인터페이스를 구현하도록 한 다음 내부 클래스 개체를 인터페이스 유형으로 업캐스트합니다.
2. 간단한 코드 구현:
public final static String name = "纯牛奶";// 名称 private static int num = 16;// 数量 public Milk() { System.out.println(name + ":16/每箱"); } /** * 闭包 * * @return 返回一个喝牛奶的动作 */ public Active HaveMeals() { return new Active() { public void drink() { if (num == 0) { System.out.println("木有了,都被你丫喝完了."); return; } num--; System.out.println("喝掉一瓶牛奶"); } }; } /** * 获取剩余数量 */ public void currentNum() { System.out.println(name + "剩余:" + num); } } /** * 通用接口 */ interface Active { void drink(); } //闭包的使用 public class Person { public static void main(String[] args) { //买一箱牛奶 Milk m = new Milk(); Active haveMeals = m.HaveMeals(); //没事喝一瓶 haveMeals.drink(); //有事喝一瓶 haveMeals.drink(); //看看还剩多少? m.currentNum(); } }
요약:
1. 클로저는 실제 프로젝트에서 많이 사용되지 않았기 때문에 품질에 대해 언급할 수 없습니다.
2. 클로저는 완전히 사용하지 말고, 남용하지 말고 합리적으로 사용하는 것이 좋습니다.
3. 특별한 주의: 위의 예에서와 같이, 메인 메소드에서 m이 null로 설정되고 haveMeals를 사용하여 drink 메소드를 계속 호출하면 우유 한 병이 여전히 재활용되지 않습니다. 소모되어 우유 개체가 해제되지 않았음을 나타냅니다.
【추천 학습: javascript 고급 튜토리얼】
위 내용은 Java와 JavaScript 클로저의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!