JavaScript 익명 함수 및 클로즈업 상세 정보
8656 단어 JavaScript익명 함수가방을 닫다
JavaScript 전단 개발에서 함수는 상태 즉 어법 환경(lexical environment)에 대한 참조와 함께 패키지(closure)를 구성합니다.즉, 패키지를 닫으면 내부 함수에서 외부 함수 작용역에 접근할 수 있다.JavaScript에서 함수는 생성될 때마다 패키지를 닫습니다.익명 함수와 패키지는 함께 공부할 수 있고 이해를 깊이 있게 할 수 있다.본고는 주로 간단한 예를 통해 익명 함수와 패키지의 흔한 용법을 약술하고 학습과 공유에만 사용하며 부족한 점이 있으면 바로잡아 주십시오.
일반 함수
일반 함수는fucntion 키워드, 함수 이름, () 및 {} 쌍으로 구성되어 있습니다. 아래와 같습니다.
function box(){
return 'Hex';
}
alert(box());
익명 함수말 그대로 익명 함수는 실제 이름이 없는 함수다.다음과 같이 별도의 익명 함수를 실행할 수 없습니다.
function (){
return 'Hex';
}
// , :
어떻게 익명 함수가 실행할 수 없는 문제를 해결합니까?다음과 같은 몇 가지 방법이 있습니다.1. 다음과 같이 익명 함수를 변수에 지정합니다.
//
var box=function(){
return 'Hex';
}
alert(box());
2. 자체 실행을 통해 함수를 호출합니다. 형식은 다음과 같습니다. (익명 함수) ()
(function(){
alert('Hex');
})();
3. 다음과 같이 익명 함수가 수행한 반환 값을 변수에 지정합니다.
var box=(function(){
return 'Hex';
})();
alert(box);// :
4. 변수를 줄이거나 다음과 같이 하십시오.
alert((function() {
return 'Hex';
})());
자가 집행 익명 함수는 어떻게 매개 변수를 전달합니까?다음과 같습니다.
(function(age) {
alert('Hex--' + age);
})(30);
패키지 닫기(closure)패키지는 함수와 이 함수를 만드는 어법 환경을 조합한 것이다.이 환경은 이 패키지를 만들 때 접근할 수 있는 모든 국부 변수를 포함합니다.간단하게 이해: 함수 안의 함수, 하위 함수는 부 함수의 작용역 안의 변수에 접근할 수 있다.
1. 함수 안에 익명 함수를 넣으면 다음과 같다.
function box(){
//
return function(){
return 'Hex';
}
}
alert(box()());
//
var b=box();
alert(b());
2. 클립을 통해 국부 변수를 되돌려줍니다. 클립을 사용하면 장점이 있고 단점이 있습니다. 국부 변수가 메모리에 주재할 수 있습니다.
function box(){
var age=100;// ,
return function(){
return age;
}
}
alert(box()());
패키지 닫기와 전역 변수 비교1. 다음과 같이 글로벌 변수 누적 사용:
var age=100;
function box(){
age++;
}
alert(age);
box();
alert(age);
box();
alert(age);
2. 다음과 같이 로컬 변수 누적을 사용합니다.
function box(){
var age=100;
age++;
return age;
}
alert(box());//
alert(box());//
alert(box());//
3. 다음과 같이 클립을 사용하여 누적합니다.
function box(){
var age=100;
return function(){
age++;
return age;
}
}
var b=box();// b
alert(b());//
alert(b());//
alert(b());//
b=null;// , ,
차이점: 전역 변수를 사용하면 명칭 충돌을 일으키기 쉽고 시스템 성능이 떨어진다.순환 익명 함수 값 추출 문제
1. 순환 중의 익명 함수 수치 문제는 다음과 같다. arr[0]=0, arr[1]=1...arr[4]=4의 효과
function box(){
var arr=[];
for (var i=0;i<5;i++) {
arr[i]=function(){
return i;
}
}
// , ,i=5
return arr;
}
var b=box();
for (var i=0;i<5;i++) {
alert(b[i]()); // 5, arr[0]=0,arr[1]=1 ...arr[4]=4
}
상기 문제는 어떻게 최적화됩니까?메서드 1, 다음과 같이 패키지를 사용하지 않고 직접 값을 부여합니다.
function box(){
var arr=[];
for (var i=0;i<5;i++) {
arr[i]=i; //
}
// , ,i=5
return arr;
}
var b=box();
for (var i=0;i<5;i++) {
alert(b[i]);
}
메서드 2는 다음과 같이 익명 함수의 자체 실행을 통해 수행됩니다.
function box(){
var arr=[];
for (var i=0;i<5;i++) {
arr[i]=(function(num){
//
return num;
})(i);
}
return arr;
}
var b=box();
for (var i=0;i<5;i++) {
alert(b[i]);
}
메서드 3, 다음과 같이 변수를 메모리에 저장합니다.
function box(){
var arr=[];
for (var i=0;i<5;i++) {
arr[i]=(function(num){
//
return function(){
return num;
};
})(i);
}
return arr;
}
var b=box();
for (var i=0;i<5;i++) {
alert(b[i]());
}
this의 지향에 관한 문제개체 내부에 대해this는 개체 자체를 가리킨다. 다음과 같다.
var box={
getThis:function(){
return this;
}
};
alert(box.getThis());// [object Object] // this box
var user='The window';
var box={
user:'The box',
getUser:function(){
return this.user;
}
}
alert(box.getUser());// :the box
this는 패키지를 닫을 때 윈도우 대상을 표시하기 때문에 패키지가 실행될 때 윈도우를 가리킨다. 다음과 같다.
var box1 ={
getThis:function(){
return function(){
return this;
}
}
};
alert(box1.getThis()()); // [object Window]// this window
var box1={
user:'The box',
getUser:function(){
// box1
return function(){
// widow
return this.user;
};
}
}
alert(box1.getUser()());// :the window , this window
어떻게 하면 닫힌this가 box를 가리키게 합니까?다음과 같은 두 가지 방법이 있습니다.
alert(box1.getUser().call(box1));//
// box
var box1={
user:'The box',
getUser:function(){
var that=this;
return function(){
return that.user;
};
}
}
alert(box1.getUser()());
단점: 패키지를 닫으면 대상을 방출할 수 없기 때문에 메모리 유출을 초래하기 쉽다. 다음과 같다.
function box(){
var a1=document.getElementById('A01');
var txt=a1.innerHTML;
a1.onclick=function(){
// a1 null,
//alert(a1.innerHTML);// ,
alert(txt);
}
// , a1
a1=null;// a1 ,
}
box();
블록 레벨 역할 영역블록급 작용역을 모방하고 대상을 향한 사상, 변수를 봉인한다.일반 함수는 다음과 같이 블록 레벨 역할 영역의 개념이 없습니다.
function box(){
for (var i=0;i<5;i++) {
}
alert(i);// :5, for ,i
}
box();
어떻게 i를 사유화하고 역할 영역을 벗어나서 방문할 수 없습니까?익명 함수의 자체 실행을 사용할 수 있는 도메인은 다음과 같이 액세스할 수 없습니다.
function box(){
(function(){
for (var i=0;i<5;i++) {
}
})();
//alert(i);// : “i”
}
box();
전역 변수의 개인 역할 영역은 다음과 같이 변수의 이름 충돌을 감소합니다.
(function(){
//
var age=100;
alert(age);
})();
//alert(age);//// : “age”
일반 함수와 구조 함수의 차이: 이니셜 대문자.대상의 속성과 함수는 모두public 형식입니다.
function Box(){
this.age=100; // ,
//
this.run=function(){
return 'running....';
}
}
var box=new Box();
alert(box.age); //
alert(box.run());//
어떻게 공유 속성을 사유화합니까?다음과 같습니다.
function Box(){
var age=100;// ,
function run(){// ,
return 'running....';
}
// ,
this.go=function(){
return age+' '+run();
}
}
var box=new Box();
alert(box.go());
구조 함수를 통해 다음과 같이 매개변수를 전달합니다.
function Box(v){
var user=v;
this.getUser=function(){
return user;
};
this.setUser=function(v){
user=v;
}
}
var box=new Box('Hex');
alert(box.getUser());
// ,
주의: 구조 함수를 통해 대상을 만들 때마다 다른 주소를 분배합니다.정적 개인 변수
다음과 같이 정적 개인 변수를 사용하여 데이터를 공유할 수 있습니다.
(function(){
var user=''; //
Box=function(value){// , Box,
user=value;
}
Box.prototype.getUser=function(){
return user;
};
Box.prototype.setUser=function(value){
user=value;
};
})();
var box=new Box('AAAA'); //
alert(box.getUser());// AAAA
var box2=new Box('BBBB');//
alert(box.getUser());// BBBB
단례 대상단례는 하나의 실례화된 대상만 있고 두 가지 실현 방식이 있을 수 있다.
1. 다음과 같이 글자 양을 통해 이루어진다.
var box={
user:'hex',
go:function(){
return user+' is running....';
}
};
alert(box.go());
2. 다음과 같이 익명 함수의 자체 실행을 통해 객체를 반환합니다.
var box=function(){
var user='Hex'; //
function run(){ //
return ' is running....';
}
//
var obj= {
//
going:function(){
return user+run();
}
}
return obj;
}();
alert(box.going());
다음은 자바스크립트 익명 함수와 패키지에 대한 상세한 내용입니다. 자바스크립트 익명 함수와 패키지에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.