JavaScript 의 패키지 와 고급 함수 (1)
JavaScript 는 대상 을 향 한 프로 그래 밍 언어 이지 만 Lambda 표현 식, 패 킷 닫 기, 고급 함수 등 함수 식 프로 그래 밍 의 특성 도 많이 있 습 니 다.
함수 식 프로 그래 밍 은 프로 그래 밍 패 러 다 임 으로 컴퓨터 연산 을 함수 의 계산 으로 간주한다.함수 프로 그래 밍 언어 에서 가장 중요 한 기 초 는?λ 연산.게다가λ연산 함 수 는 함 수 를 입력 (매개 변수) 과 출력 (반환 값 으로 받 아들 일 수 있 습 니 다.
폐쇄 하 다
패 킷 을 닫 는 것 은 무엇 입 니까? 패 킷 을 닫 는 여러 위치 에 대해 각자 의 견 해 를 가지 고 있 습 니 다. 지금 은 패 킷 을 닫 는 것 은 외부 역할 영역 에서 변수 와 매개 변 수 를 방문 할 권리 가 있 는 함 수 를 말 합 니 다. 가장 흔히 볼 수 있 는 것 은 특정한 함수 내부 에 다른 함 수 를 만 드 는 것 입 니 다. 예 를 들 어:
var count = (function() {
var item = 0;
return {
add: function(num) {
item += typeof num === 'number' ? num : 1;
},
value: function() {
return item;
}
}
})();
함수 가 되 돌아 오 는 결 과 를 count 에 할당 합 니 다. 이 함 수 는 두 가지 방법 을 포함 하 는 대상 을 되 돌려 줍 니 다. 대상 의 방법 은 함수 에 포 함 된 변수 와 매개 변 수 를 방문 할 수 있 습 니 다. count 에 저 장 된 것 은 이 대상 의 참조 입 니 다. 대상 의 방법 은 실행 함수 에 있 는 변 수 를 방문 할 수 있 고 변수 자체 에 접근 할 수 있 습 니 다.
패 킷 함 수 는 만 들 때 있 는 컨 텍스트 환경 에서 의 변수 와 매개 변수 에 접근 할 수 있 습 니 다. this 및 arguments 는 제외 합 니 다.
폐쇄 는 사실 잘 논술 되 지 않 습 니 다. 저 에 게 있어 서 자기 이해 와 다른 사람 에 게 논술 하 는 차이 가 매우 크 지만 이 를 정복 하려 고 합 니 다. 폐쇄 의 형성 은 변수 와 밀접 한 관 계 를 가지 고 있 습 니 다. 특히 변수의 역할 과 변수의 생명 주 기 는 자세히 보 세 요.
패키지 와 변수
패 킷 에 저 장 된 것 은 전체 변수 대상 인 실행 환경 (문맥 환경) 에서 변 수 를 나타 내 는 대상 의 참조 입 니 다. 실행 환경 에 접근 하 는 변 수 는 이 변수 대상 에 접근 하 는 변수 입 니 다.
변수 대상 의 모든 실행 환경 (상하 문 환경) 중 하 나 는 모든 변 수 를 나타 내 는 대상 이 고 전역 환경의 변수 대상 은 항상 존재 하 며 국부 환경의 변수 대상 은 그 실행 과정 에서 만 존재 한다.
전형 적 인 사례 는 다음 과 같다.
function myNumber() {
var count = [];
for (var i = 0; i < 10; i ++) {
count[i] = function() {
return i;
}
}
return count;
}
이 함 수 는 함수 배열 을 되 돌려 줍 니 다. 이 배열 은 순 순 히 자신의 숫자 로 돌아 갈 수 있 습 니까? 물론 입 니 다. 사실은 모든 함수 가 10 으로 되 돌아 갑 니 다. 왜 일 까요? 자세하게 말 하면 모든 함수 의 역할 영역 체인 에 my Number () 함수 의 활동 대상 (변수 대상) 이 저장 되 어 있 기 때 문 입 니 다.그들 은 모두 같은 변수 대상 을 인용 합 니 다. 물론 같은 변수 i 도 참조 합 니 다. my Number () 함수 가 돌아 온 후에 i 는 10 입 니 다.
다음 코드 를 보십시오.
function myNumber() {
var count = [];
for (var i = 0; i < 10; i ++) {
count[i] = (function(num) {
return function() {
return num;
};
})(i);
}
return count;
}
이 곳 에서 익명 함수 결 과 를 배열 에 할당 하고 모든 익명 함 수 를 호출 할 때 변수 i 를 입력 합 니 다. 함수 매개 변 수 는 값 에 따라 전달 되 며 변수 값 을 매개 변수 num 에 복사 합 니 다. 이 익명 함수 내부 에서 num 매개 변수 에 접근 하 는 패 키 지 를 만 들 고 되 돌려 줍 니 다. count 배열 의 함 수 는 모두 자신의 num 변수 가 있 는 사본 을 저장 하여 각자 의 값 을 되 돌려 줍 니 다.
변수의 역할 영역
변 수 는 전역 변수 와 국부 변수 로 나 뉘 는데 함수 에서 변 수 를 설명 할 때 var 키워드 로 정 의 된 변 수 는 국부 변수 이 고 var 키 워드 를 가지 고 있 지 않 으 면 전역 변수 가 된다.
var c = 3
var func = function() {
var a = 1;
b = 2;
alert(b);//2
alert(c);//3
}
func();
alert(b);//2
alert(a);//Uncaught ReferenceError: b is not defined
함수 에서 변 수 를 찾 을 때 먼저 현재 함수 에서 환경 역할 도 메 인 을 찾 습 니 다. 찾 지 못 하면 현재 실행 환경 에서 만 든 역할 도 메 인 체인 에 따라 외부 로 찾 습 니 다. 전체 대상 까지 여기 서 찾 는 것 은 내부 에서 외부 로 찾 는 것 입 니 다.
변수의 생명주기
위 에서 변수 역할 영역 에 대해 말 했 는데 여기 서 변수 수명 주 기 를 이야기 합 니 다.
var func = function() {
var res = [1,2,3,4,5,6];
var a = 0;
return function() {
alert(res[a]);
a++;
}
};
var f = func();
func()();//1
func()();//1
f();//1
f();//2
f();//3
fun () 과 f () 의 팝 업 값 을 비교 해 보 세 요. f () 에 a 가 계속 존재 하 는 것 같 습 니 다. var f = func () 를 실행 할 때 f 함 수 는 익명 함수 의 참조 로 되 돌아 갑 니 다. 이 익명 함 수 는 func () 가 호출 되 었 을 때의 컨 텍스트 환경 (실행 환경) 에 접근 할 수 있 습 니 다.국부 변 수 는 그 중에서 국부 변수 가 처 한 환경 이 외부 에 접근 할 수 있 고 국부 변 수 는 소각 되 지 않 는 다.
폐쇄 적 역할
var mult = function() {
var a = 1;
for (var i = 0, len = arguments.length; i < len; i++) {
a = a * arguments[i];
}
return a;
}
alert(mult(1,2,3,4));
function block() {
var res = [1,3,5,7,9];
for (var i = 0; i < res.length; i++) {
alert(res[i]);
}
var i;//
alert(i);//5
}
위 코드 에서 보 듯 이 i 변 수 는 정 의 된 후에 전체 함수 에 접근 할 수 있 습 니 다. JavaScript 에서 for 문 구 는 블록 급 역할 도 메 인 을 형성 하지 않 습 니 다. 전체 역할 도 메 인 은 함수 생 성 을 포함 하고 변수 에 대한 후속 성명 은 무 시 됩 니 다. 블록 급 역할 도 메 인 효 과 를 얻 으 려 면 폐쇄 적 으로 모방 할 수 있 습 니 다. 예 를 들 어:
(function() {
//
})()
(function() {
var name = 'xjg';
function getName() {
reutn name;
}
Person = function(val) {
name = val;
}
Person.getName = function() {
return name;
}
})();
var p1 = new Person('Anagle');
alert(p1.getName());//Anagle
alert(getName())//ReferenceError: getName is not defined
이 곳 에서 name 은 정적 개인 변수 가 되 었 습 니 다.
패 킷 및 메모리 누설
부분 변 수 는 원래 함수 가 종 료 될 때 소각 되 었 으 나 패 킷 에 서 는 그렇지 않 습 니 다. 부분 변 수 는 수명 주기 가 길 어 지고 패 킷 을 닫 으 면 이 데 이 터 를 제때에 소각 하지 못 하고 메모 리 를 점용 하여 메모리 누 출 을 초래 하기 쉽 습 니 다. 예 를 들 어:
function addHandle() {
var element = document.getElementById('myNode');
element.onclick = function() {
alert(element.id);
}
}
이 곳 에서 onclick 익명 함 수 는 함수 활동 대상 (변수 대상) 을 포함 하 는 인용 을 저장 합 니 다. element 의 인용 을 저장 하면 element 는 회수 되 지 않 습 니 다.
function addHandle() {
var element = document.getElementById('myNode');
var id = element.id;
element.onclick = function() {
alert(id);
}
element = null;
}
이 곳 은 element 를 null 로 설정 합 니 다. 즉, 인용 을 해제 하고 쓰레기 회수 기 는 메모리 사용량 을 회수 합 니 다.
이 편 은 자 바스 크 립 트 패키지 에 대해 정리 하고 논술 하 였 으 며, 지면 에 한 하여 다음 편 에서 자 바스 크 립 트 의 고급 함 수 를 설명 하 였 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.