js에서 익명 함수의 생성 및 호출 방법 분석

6757 단어
본고는 js에서 익명 함수의 생성과 호출 방법을 실례적으로 분석하였다.여러분에게 참고할 수 있도록 나누어 드리겠습니다.구체적인 실현 방법은 다음과 같다.
익명 함수는 이름이 없는 함수입니다. 폐쇄 함수 (closures) 라고도 합니다. 지정한 이름이 없는 함수를 임시로 만들 수 있습니다.리셋 함수 (callback) 매개 변수의 값으로 가장 자주 사용되며, 많은 초보 친구들이 익명 함수에 대해 잘 모른다.여기서 분석해 보겠습니다.
function 함수 이름 (매개 변수 목록) {함수체;}
익명 함수를 만들려면:function () {함수체;}
익명 함수이기 때문에 일반적으로 그에게 매개 변수가 전달되지 않는다.
왜 익명 함수를 만듭니까?어떤 상황에서 익명 함수를 사용할지익명 함수는 주로 두 가지 자주 사용하는 장면이 있는데 하나는 리셋 함수이고, 다른 하나는 직접 집행 함수이다.
리셋 함수, 예를 들어ajax의 비동기적인 조작은 리셋 함수가 필요합니다.여기는 상세하지 않습니다.직접 실행 함수에 관해서 나는 하나의 예를 보면 알 수 있다.

    
  <br> var a = "a"; 
  <br> (function(){ 
  <br>     var a="b"; 
  <br>     alert(a); 
  <br> })(); 
  <br> alert(a); 
  <br>  
 

위의 코드에서 두 개의alert 상자를 순서대로 출력합니다.첫 번째alert 상자의 내용은 b이고, 두 번째는 a입니다.여러분 좋은 점 보셨나요?맞아요. 함수를 사용하여 변수의 작용역을 한정하여 서로 다른 스크립트의 같은 변수가 공존할 수 있도록 합니다.
다음은 익명 함수와 관련된 개념을 초보적으로 알아보자.
함수 성명 (function 문장) 을 사용하려면 함수의 존재를 먼저 설명해야 합니다.우리가 가장 자주 사용하는 방식은 function 문장을 사용하여 함수를 정의하는 것이다. 예를 들어 다음과 같다.

   function abc(){ 
  
// code to process
}
function abc(){ // code to process }

물론 당신의 함수도 매개 변수를 가지고 있을 수도 있고, 심지어는 되돌아오는 값을 가지고 있을 수도 있습니다.

   view plaincopy to clipboardprint? 
  
function abc(x,y){
return x+y;
}
function abc(x,y){ return x+y; }

그러나 JS 해석기는 함수를 어떻게 정의하든지 Function 대상으로 번역합니다.예를 들어, 위의 예 중 하나의 함수 번호를 정의하고 다음 코드를 입력하십시오.

   alert(typeof abc);// "function" 
 

브라우저에서 abc가 Function 대상이라는 알림 상자를 팝업합니다.과연 Function 대상은 무엇일까요?
Function 객체
Function 객체는 JavaScript 내의 고유 객체이며 모든 함수는 사실상 Function 객체입니다.우선 Function 대상이 구조 함수를 직접 활용하여 새로운 함수를 만들 수 있는지 봅시다.답은 긍정적이다.예:

   var abc = new Function("x","y","return x*y;"); 
  
alert(abc(2,3)); // "6"

여러분이 지금 함수를 어떻게 성명하는지에 대해 알고 있을 것이라고 믿습니다.그럼 익명 함수는 무엇일까요?
익명 함수 선언
말 그대로 익명 함수는 실제 이름이 없는 함수다.예를 들어 우리는 위의 예에서 함수의 이름을 빼고 그가 하나의 함수인지 아닌지를 판단한다.

   alert(typeof function(){});// "function" 
  
alert(typeof function(x,y){return x+y;});// "function"
alert(typeof new Function("x","y","return x*y;"))// "function"
alert(typeof function(){});// "function"
alert(typeof function(x,y){return x+y;});// "function"
alert(typeof new Function("x","y","return x*y;"))// "function"

우리는 그것들이 모두 Function 대상이라는 것을 쉽게 볼 수 있다. 다시 말하면 그들은 모두 함수이지만, 그들은 모두 이름이 없다는 특징을 가지고 있다.그래서 우리는 그들을'익명 함수'라고 부른다.그러나 그들이 이름이 없기 때문에 우리도 그들을 찾을 방법이 없다.이것은 어떻게 익명 함수를 호출하는지 설명한다.
익명 함수 호출
함수를 호출하려면, 우리는 그것을 포지셔닝하고 인용할 방법이 있어야 한다.그래서 우리는 그것을 도와 이름을 찾아야 한다.예:

   var abc=function(x,y){ 
  
return x+y;
}
alert(abc(2,3)); // "5"

위의 조작은 사실 다른 방식으로 함수를 정의하는 것과 같다. 이런 용법은 우리가 비교적 빈번하게 만나는 것이다.예를 들어 우리가 DOM 요소 이벤트 처리 함수를 설정할 때, 우리는 보통 그들을 위해 이름을 정하지 않고, 그에 대응하는 이벤트에 익명 함수를 인용하도록 부여한다.
익명 함수에 대한 호출은 사실 우리가 본 jQuery 단편인 () 을 사용하여 익명 함수를 묶고 뒤에 괄호 한 쌍 (인자 목록 포함) 을 추가하는 방법도 있다.다음 예를 살펴보겠습니다.

   alert((function(x,y){return x+y;})(2,3));// "5" 
  
alert((new Function("x","y","return x*y;"))(2,3));// "6"

많은 사람들이 이상할지도 모르지만, 왜 이런 방법이 성공적으로 호출될 수 있습니까?이 앱이 이상하다고 생각하는 사람은 아래의 설명을 보십시오.
여러분은 괄호의 작용을 아십니까?소괄호는 우리의 표현식 조합을 블록으로 나눌 수 있으며, 각 블록, 즉 각 쌍의 소괄호는 모두 반환값이 있다.이 반환값은 사실상 소괄호 표현식의 반환값이다.그래서 우리가 한 쌍의 소괄호로 익명 함수를 묶을 때, 실제로 소괄호는 되돌아오는 것이 익명 함수의 Function 대상이다.따라서 소괄호는 익명 함수를 더하면 이름이 있는 함수처럼 인용 위치를 얻게 된다.따라서 이 인용 변수 뒤에 매개 변수 목록을 추가하면 일반 함수의 호출 형식을 실현할 수 있습니다.
위의 글은 여러분이 알아볼 수 있을지 모르겠지만 이해가 안 된다면 아래의 코드를 다시 한 번 보세요.

   var abc=function(x,y){return x+y;};//  abc 
  
// abc constructor constructor 。 , 。
alert((abc).constructor==(function(x,y){return x+y;}).constructor);

PS:constructor는 객체를 작성하는 함수입니다.함수 대상이 대표하는 함수체다.한 마디로 하면 괄호에 포함된 익명 함수를 괄호 표현식으로 되돌아오는 함수 대상으로 이해하고 이 함수 대상을 정상적인 매개 변수 목록으로 호출할 수 있다.(앞에서 함수 표현식만 호출할 수 있는 오류가 발생했습니다. 익명 함수 괄호를 제거하려면 표현식 값을 수반해야 합니다. 즉, (function () {alert (1)}) () 는 a=function () {alert (1)} () 와 같은 값이어야 합니다. a=도 제거할 수 없습니다.)
가방을 닫다
가방을 닫는 것은 무엇입니까?패키지는 특정한 프로그램 언어의 코드 블록이 1급 함수가 존재하고 1급 함수에 정의된 자유 변수가 방출되지 않고 1급 함수가 방출되기 전까지 1급 함수 밖에서도 방출되지 않은 자유 변수를 응용할 수 있도록 하는 것을 말한다.
어때요?땀 흘리는 거 봤지... 괜찮아, 나도.패키지를 닫는 것은 사실 언어 특성이다. 프로그램 설계 언어에서 함수를 대상으로 간주하고 대상에서의 조작처럼 함수에서 실례(국부) 변수를 정의할 수 있도록 하는 것을 말한다. 이 변수들은 함수에 저장되어 함수의 실례 대상이 소각될 때까지다른 코드 블록은 어떤 방식으로 이러한 실례 (국부) 변수의 값을 얻고 응용 확장을 할 수 있다.
이렇게 재해석한 후에 더욱 명확해질지 모르겠지만, 만약 아직도 모르겠다면, 우리는 다시 한 번 간소화합시다. 패키지를 닫는 것은 사실 프로그램 언어에서 코드가 실행된 함수에 정의된 국부 변수를 호출할 수 있도록 하는 것을 가리킨다.
이제 예를 들어 보겠습니다.

   var abc=function(y){ 
  
var x=y;//
return function(){
alert(x++);// x ,
alert(y--);//
}}(5);//
abc();// "5" "5"
abc();// "6" "4"
abc();// "7" "3"
alert(x);// !“x” !

여기 보시면 도대체 jQuery의 코드 세션이 패키지를 닫았는지 판단할 수 있습니까?
내 이해로 말해봐.폐쇄 기능을 응용했는지 여부는 이 단락 코드에 가장 중요한 요소가 있는지 확인해야 한다. 소각되지 않은 국부 변수이다.그러면 어떤 실현된 익명 함수도 없이 패키지 기능을 적용할 수 없다는 것은 명백하다.하지만 익명 함수에서 실현된다면?그것도 그 실현에 소각되지 않은 국부 변수가 사용되었는지 확인해야 한다.그래서 만약에 그 개편의 jQuery 코드 세션이 JS의 어떤 특성을 응용했냐고요?그러면 그것은 익명 함수와 익명 함수의 호출일 뿐이다.그러나 이것은 폐쇄의 특성을 포함하고 언제든지 폐쇄 응용을 실현할 수 있다.
가장 일반적인 사용법:

   (function() { 
  
alert('water');
})();

물론 매개 변수를 가지고 있을 수도 있다.

   (function(o) { 
  
alert(o);
})('water');

익명 함수의 체인 호출을 원하십니까?간단합니다.

   (function(o) { 
  
alert(o);
return arguments.callee;
})('water')('down');

흔히 볼 수 있는 익명 함수는 모두 알고 있다. 흔히 볼 수 없는 것을 봐라.

   ~(function(){ 
  
alert('water');
})();// ~
 
void function(){
alert('water');
}();// ~
 
+function(){
alert('water');
}();
 
-function(){
alert('water');
}();
 
~function(){
alert('water');
}();
 
!function(){
alert('water');
}();
 
(function(){
alert('water');
}());// ~

본고에서 기술한 것이 여러분의javascript 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기