자바스크립트 익명 함수 이해(완전 버전)_javascript 기술
(function(){
//모두 무시 여기에서 jQuery 구현
})();
(function(){ //여기에서 jQuery의 모든 구현을 무시})()
처음 jQuery half를 접했을 때 1년 전, 저는 다른 사람들과 마찬가지로 소스 코드가 어떻게 생겼는지 보고 매우 기뻤습니다. 그런데 처음 소스코드를 봤을 때 혼란스러웠습니다. 익명 함수가 하나만 있고 실행 중인 것을 아무도 볼 수 없는데(물론 실행 중입니다...) jQuery와 같은 함수 라이브러리가 있을 수 있는 이유는 무엇입니까? 그래서 질문이 있어서 CSDN에 왔습니다. 결과적으로 지금은 많은 분들이 확실히 알고 계신 것 같아요. (나를 따라오는 분들도 많으니까요, 하하~) 익명 함수를 괄호로 묶은 다음 괄호를 사용하면 익명 함수를 즉시 실행할 수 있습니다! 정말 놀랍습니다!
헤헤! 말도 안되는 일이 너무 많습니다. 이 섹션에서 우리가 만난 jQuery 조각은 즉시 실행되는 익명 함수 세트입니다. 이 사용법은 포럼에서 열띤 논쟁을 불러일으켰습니다. 이 코드가 클로저에 속합니까? 우리는 이 질문을 염두에 두고 기본부터 시작하여 각 핵심 요소를 분석하고 우리만의 답을 찾습니다. (예, 제 답변입니다! 제 생각에는 모든 이론은 단지 형식일 뿐입니다. 응용 프로그램의 구현에 도움이 되는 한 바람직합니다. 검은 고양이와 흰 고양이, 쥐를 잡는 고양이는 좋은 고양이입니다! )
익명 함수에 대해 이야기하려면 먼저 함수 자체부터 시작해야 합니다. 함수의 정의는 다음과 같습니다.
함수는 각 입력에 고유한 출력 값을 할당하는 "규칙"입니다.
물론 이것은 단지 수학적 정의일 뿐입니다. 그러나 컴퓨터 프로그래밍 언어에서는 함수의 정의가 비슷합니다. 우리 모두는 컴퓨터의 기능이 수학적 정의의 설명과 유사하다는 것을 알고 있기 때문에 코드에 의해 설정된 논리적 연산을 통해 일부 입력 데이터를 처리하고 고유한 출력을 반환하는 코드 조합 블록 집합입니다. ——물론 입력 데이터가 비어 있거나 출력 데이터가 비어 있거나 둘 다 비어 있는 경우는 특별한 경우입니다.
다음으로 익명함수와 관련된 개념을 미리 살펴보겠습니다.
함수 선언(함수문)
함수를 사용하려면 먼저 함수의 존재를 선언해야 합니다. 함수 명령문을 사용하는 가장 일반적인 방법은 다음과 같이 함수를 정의하는 것입니다.
function abc(){
// 처리할 코드
}
function abc(){ // 처리할 코드 }
물론, 함수 반환 값이 있는 경우에도 매개 변수를 사용할 수도 있습니다.
클립보드 인쇄로 일반 복사본을 보시겠습니까?
function abc(x,y){
return x y;
}
function abc(x,y){ return x y;
alert(typeof abc);// "function"
브라우저에 프롬프트 상자에서 귀하의 abc는 함수 개체입니다라는 메시지를 표시합니다. 그렇다면 Function 객체란 정확히 무엇일까요?
함수 객체
함수 객체는 JavaScript의 고유 객체입니다. 모든 함수는 실제로 Function 객체입니다. 이 측면에 대한 논의는 다음 주제 섹션으로 남겨둡니다. 먼저 Function 객체가 생성자를 직접 사용하여 새 함수를 생성할 수 있는지 살펴보겠습니다. 대답은 '예'입니다. 예:
alert(abc(2,3)) // "6"
var abc = new Function("x" ,"y" ,"return x*y;"); Alert(abc(2,3)); // "6"
익명 함수 선언
이름에서 알 수 있듯이 익명 함수는 실제 이름이 없는 함수입니다. 예를 들어, 위의 예에서 함수의 이름을 제거한 다음 함수인지 여부를 판단해 보겠습니다.
alert(typeof function(x,y){return x y;}) ;// "함수"
alert(typeof new Function("x","y","return x*y;"))// "함수"
alert(typeof function(){}); // " 함수" Alert(typeof function(x,y){return x y;});// "함수" Alert(typeof new Function("x","y","return x*y;"))/ / "함수"
우리는 그것들이 모두 함수 객체라는 것을 쉽게 알 수 있습니다. 즉, 모두 함수이지만 모두 이름이 없다는 하나의 기능을 가지고 있습니다. 그래서 우리는 이를 "익명 함수"라고 부릅니다. 그러나 '이름'이 없기 때문에 우리는 그들을 찾을 방법이 없습니다. 이는 익명 함수를 호출하는 방법에 대한 질문으로 이어집니다.
익명 함수 호출
함수를 호출하려면 해당 함수를 찾고 참조할 수 있는 방법이 있어야 합니다. 그래서 우리는 그것에 대한 이름을 찾아야 할 것입니다. 예:
var abc=function(x ,y){
return x y;
}
alert(abc(2,3)); // "5"
var abc=function(x,y){ return x y ; (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"
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의 생성자는 익명 함수의 생성자와 동일합니다. 즉, 두 기능의 구현은 동일합니다.
alert((abc).constructor==(function(x,y){return x y;}).constructor)
var abc=function(x,y){return x y;};// 익명 함수 객체는 abc에 할당됩니다. // abc의 생성자는 익명 함수의 생성자와 동일합니다. 즉, 두 기능의 구현은 동일합니다. 경고((abc).constructor==(function(x,y){return x y;}).constructor)
PS: 생성자는 객체를 생성하는 기능을 말합니다. 즉, 함수 객체가 표현하는 함수 본문입니다.
간단히 말해서 (괄호로 묶인 익명 함수)를 괄호 표현식이 반환하는 함수 개체로 이해하면 이 함수 개체에 대한 일반적인 매개 변수 목록 호출을 만들 수 있습니다. (여기서 실수를 했습니다. 함수 표현식만으로는 함수를 직접 호출할 수 없습니다. 익명 함수 괄호를 제거하려면 표현식 할당이 수반되어야 합니다. 즉, (function(){alert(1)})()는 a =function(){alert(1)}()과 동일합니다. a=를 제거할 수 없습니다. )
클로저
클로저란 무엇인가요? 클로저(Closure)는 첫 번째 수준 함수가 존재하도록 허용하고 첫 번째 수준 함수에 정의된 자유 변수를 첫 번째 수준 함수가 해제될 때까지 해제할 수 없도록 하는 특정 프로그래밍 언어의 코드 블록을 의미합니다. 첫 번째 수준 함수 외부에 적용됩니다. 자유 변수가 해제되었습니다.
어떻게요? 보고 나면 땀이 뻘뻘 나실 텐데... 괜찮아요, 저도요(이해하지만, 표현력의 문제일 뿐이죠). 더 간단하게 설명하자면, 클로저는 실제로 함수를 객체로 처리할 수 있는 프로그래밍 언어를 의미하며 객체의 작업과 같은 작업을 이동하여 함수의 인스턴스를 정의할 수 있습니다. ) 변수이며, 이러한 변수는 함수의 인스턴스 개체가 소멸될 때까지 함수에 저장할 수 있습니다. 다른 코드 블록은 어떤 방식으로든 이러한 인스턴스(로컬) 변수의 값을 얻고 응용 프로그램을 확장할 수 있습니다.
이렇게 설명하면 더 명확해질지 모르겠습니다. 그래도 이해가 되지 않는다면 다시 단순화해 보겠습니다. 클로저는 실제로 코드를 허용하는 프로그래밍 언어에서 정의된 로컬 부분을 나타냅니다. 실행 중인 변수를 호출합니다.
이제 예를 살펴보겠습니다.
var abc=function(y){
var x=y;// 이것은 지역 변수입니다
return function(){
alert(x );// 이것은 클로저 기능 중 레벨 함수 지역 변수 // "5" "5"
abc();// "6" "4"
abc();// "7" "3"
alert(x);// 오류! "x"가 정의되지 않았습니다!
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 코드 조각이 닫혀 있는지 알 수 있나요?

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

람다 식이라고도 하는 익명 함수는 이름을 지정하지 않고 일회용으로 사용하거나 함수 포인터를 전달하는 데 사용되는 함수입니다. 기능에는 익명성, 일회용 사용, 폐쇄, 반환 유형 추론이 포함됩니다. 실제로는 정렬이나 기타 일회성 함수 호출에 자주 사용됩니다.

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

예, Go 언어의 익명 함수는 여러 값을 반환할 수 있습니다. 구문: func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//함수 본문}. 사용법: 반환 값을 받으려면 := 연산자를 사용하고, 여러 값을 반환하려면 return 키워드를 사용하세요.

JavaScript 및 WebSocket: 효율적인 실시간 검색 엔진 구축 소개: 인터넷이 발전함에 따라 사용자는 실시간 검색 엔진에 대한 요구 사항이 점점 더 높아지고 있습니다. 기존 검색 엔진으로 검색할 때 사용자는 검색 버튼을 클릭해야 결과를 얻을 수 있습니다. 이 방법은 실시간 검색 결과에 대한 사용자의 요구를 충족할 수 없습니다. 따라서 JavaScript와 WebSocket 기술을 활용하여 실시간 검색 엔진을 구현하는 것이 화두가 되었습니다. 이 기사에서는 JavaScript의 사용법을 자세히 소개합니다.

Python Lambda 표현식은 변수에 표현식을 저장하고 해당 값을 반환하는 작은 익명 함수입니다. 람다 표현식은 별도의 함수를 작성하여 수행할 수 있는 간단한 작업을 수행하는 데 자주 사용되지만, 람다 표현식을 사용하면 코드를 더 간결하고 읽기 쉽게 만들 수 있습니다. Lambda 표현식의 구문은 다음과 같습니다. 람다 인수: 표현식 인수는 람다 표현식에서 수신한 매개변수 목록이고 표현식은 실행해야 하는 코드가 포함된 람다 표현식의 본문입니다. 예를 들어 다음 Lambda 표현식은 두 숫자를 더하고 해당 합계를 반환합니다.

람다 표현식과 익명 함수는 모두 Python에서 익명 함수를 생성하는 방법이지만 차이점이 있습니다. 할당 방법: 람다 표현식은 함수를 반환하며, 사용할 변수에는 익명 함수를 할당해야 합니다. 코드 복잡성: 람다 식은 하나의 식만 포함할 수 있지만 익명 함수는 여러 문을 포함할 수 있습니다.

pythonLambda 표현식은 간결하고 읽기 쉽고 사용하기 쉬운 코드를 생성하기 위한 강력하고 유연한 도구입니다. 다른 함수에 인수로 전달되거나 변수에 저장될 수 있는 익명 함수를 빠르게 생성하는 데 유용합니다. Lambda 표현식의 기본 구문은 다음과 같습니다.lambdaarguments:expression예를 들어 다음 Lambda 표현식은 두 개의 숫자를 추가합니다.lambdax,y:x+y 이 Lambda 표현식은 다음과 같이 다른 함수에 인수로 전달될 수 있습니다. defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2)이 예에서는
