자바스크립트 스코프 사용법과 클로저에 대한 자세한 설명_기본지식
범위 중첩은 범위 체인을 형성하고, 함수 중첩은 클로저를 형성합니다. 클로저와 범위 체인은 JavaScript를 다른 언어와 구별하는 중요한 기능 중 하나입니다.
범위
자바스크립트에는 함수 범위와 전역 범위라는 두 가지 범위가 있습니다.
함수에 선언된 변수와 함수의 매개변수는 동일한 범위, 즉 함수 범위를 공유합니다. 함수 범위의 간단한 예:
function foo() {
var bar = 1 ;
{
var bar = 2;
}
return bar; // 2
}
C와 같은 다른 블록 범위 언어와 달리 이는 항상 2를 반환합니다.
브라우저의 경우 전역 범위는 창 개체로 이해될 수 있습니다(Node.js는 전역입니다).
var bar = 1;
function foo() {}
alert(window.bar) // 1
alert(window.foo) ) ; // "함수 foo() {}"
bar 변수와 foo 함수는 모두 전역 범위에 속하며 둘 다 window의 속성입니다.
스코프 체인
자바스크립트에서 변수에 접근할 때는 지역 변수와 매개변수에서 시작하여 전역 범위에 도달할 때까지 단계적으로 범위를 순회합니다.
varscope = 0, zero = "global -scope" ;
(function(){
var 범위 = 1, one = "scope-1";
(function(){
var 범위 = 2, two = "scope-2 ";
(function(){
var 범위 = 3, 3 = "scope-3";
범위-1 전역 범위
console.log([3, 2, 1, 0 ].join(" "));
console.log(scope); // 3
})() 🎜> console.log(scope);
console.log(typeof two); // 정의되지 않음
console.log(scope); // 1
})();
console.log(typeof one); 🎜>console.log(범위); // 0
가장 안쪽 함수에서는 각 변수를 단계별로 탐색하여 출력할 수 있습니다. 두 번째 함수 계층에서는 순회를 통해 변수 3을 찾을 수 없으므로 정의되지 않음이 출력됩니다.
클로저
한 함수에서 다른 함수를 정의하는 것을 함수 중첩이라고 합니다. 함수의 중첩은 클로저를 형성합니다.클로저와 범위 체인은 서로를 보완합니다. 함수의 중첩은 체인 관계에서 여러 범위를 생성할 뿐만 아니라 클로저를 형성합니다.
코드 복사
}
그럼 클로저를 어떻게 이해하나요?
그러나 내장 함수는 외부 함수의 매개변수와 변수에 접근할 수 있습니다
즉, 내장 함수는 외부 함수 앞서 언급한 스코프 체인 예시를 살펴보겠습니다. 이번에는 클로저의 관점에서 이해해 보겠습니다.
코드 복사
var 범위 = 0, zero = "전역 범위";
(function(){
var 범위 = 1, one = "scope-1";
(함수() {
var 범위 = 2, two = "scope-2";
(function(){
var range = 3, three = "scope-3";
// 범위-3 범위 -2 범위-1 전역 범위
console.log([3, 2, 1, 0].join(" "));
console.log(scope) // 3
}) ();
console.log(typeof three); // 정의되지 않음
console.log(scope) // 2
})();
console.log(typeof two); / 정의되지 않음
console.log(scope); // 1
})();
console.log(typeof one); // 정의되지 않음
console.log(scope);
가장 안쪽 함수는 내부 및 외부에 정의된 모든 변수에 액세스할 수 있습니다. 두 번째 레이어 함수는 가장 안쪽 레이어에 접근할 수 없습니다. 동시에 가장 안쪽 레이어의 범위 = 3 할당 작업은 동일한 이름의 외부 변수에 영향을 주지 않습니다.
다른 각도에서 클로저를 이해해 봅시다:
외부 함수가 호출될 때마다 내장 함수가 한 번 생성됩니다.
생성되면 외부 함수의 범위(지역 변수, 매개변수 등 컨텍스트 포함)가 각 내장 함수 개체가 됩니다. 외부 함수가 실행을 완료하고 종료한 후에도 내부 상태의 일부
다음 예를 참조하세요.
var i, list = [];
for (i = 0; i list.push(function(){
console.log(i);
});
}
list .forEach(function(func){
func();
});
예상된 "1"과 "2" 대신 "2"가 두 번 표시됩니다. 이는 목록의 두 함수에 의해 액세스된 변수 i가 상위 범위에서 동일한 변수이기 때문입니다.
이 문제를 해결하기 위해 클로저를 사용하도록 코드를 변경해 보겠습니다.
var i, list = [];
for (i = 0; i list.push((function(j){
) return function(){
console.log(j);
} ;
})(i));
}
list.forEach(function(func){
func();
});
외부 "즉시 실행 함수"는 함수 내에서 매개변수 j의 형태로 존재하는 매개변수 변수 i를 수신합니다. 이는 반환된 내부 함수에서 j라는 이름과 동일한 참조를 가리킵니다. 외부 함수가 실행되고 종료된 후 매개변수 j(그 값은 현재 i의 현재 값)가 내부 함수의 상태의 일부가 되어 저장됩니다.

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











typedef struct는 C 언어에서 구조 사용을 단순화하기 위해 구조 유형 별칭을 만드는 데 사용됩니다. 구조 별칭을 지정하여 기존 구조에 새 데이터 유형의 별칭을 지정합니다. 향상된 가독성, 코드 재사용 및 유형 확인 등의 이점이 있습니다. 참고: 별칭을 사용하기 전에 구조를 정의해야 합니다. 별칭은 프로그램에서 고유해야 하며 선언된 범위 내에서만 유효해야 합니다.

Java의 변수 예상 값 예외는 변수 초기화, null 값 사용, 지역 변수 범위 파악을 통해 해결할 수 있습니다.

C++의 #include 전처리기 지시문은 외부 소스 파일의 내용을 현재 소스 파일에 삽입하고 해당 내용을 현재 소스 파일의 해당 위치에 복사합니다. 표준 입출력 함수를 포함하기 위한 #include <iostream>과 같이 코드에 필요한 선언이 포함된 헤더 파일을 포함하는 데 주로 사용됩니다.

JavaScript 클로저의 장점에는 변수 범위 유지, 모듈식 코드 활성화, 실행 지연 및 이벤트 처리가 포함됩니다. 단점에는 메모리 누수, 복잡성 증가, 성능 오버헤드 및 범위 체인 효과가 포함됩니다.

C++ Lambda 표현식은 함수 범위 변수를 저장하고 함수에 액세스할 수 있도록 하는 클로저를 지원합니다. 구문은 [캡처 목록](매개변수)->return-type{function-body}입니다. 캡처 목록은 캡처할 변수를 정의합니다. [=]를 사용하여 모든 지역 변수를 값으로 캡처하고, [&]를 사용하여 모든 지역 변수를 참조로 캡처하거나, [변수1, 변수2,...]를 사용하여 특정 변수를 캡처할 수 있습니다. 람다 표현식은 캡처된 변수에만 액세스할 수 있지만 원래 값을 수정할 수는 없습니다.

C++ 스마트 포인터의 수명 주기: 생성: 스마트 포인터는 메모리가 할당될 때 생성됩니다. 소유권 이전: 이동 작업을 통해 소유권을 이전합니다. 해제: 스마트 포인터가 범위를 벗어나거나 명시적으로 해제되면 메모리가 해제됩니다. 객체 소멸: 가리키는 객체가 소멸되면 스마트 포인터는 유효하지 않은 포인터가 됩니다.

JavaScript에서 이 포인팅 유형은 다음을 포함합니다: 1. 전역 객체, 2. 함수 호출, 3. 생성자 호출, 5. 화살표 함수(외부 상속). 또한, 바인딩(), call() 및 apply() 메서드를 사용하여 이것이 가리키는 내용을 명시적으로 설정할 수 있습니다.

할 수 있다. C++에서는 중첩된 함수 정의 및 호출을 허용합니다. 외부 함수는 내장 함수를 정의할 수 있고 내부 함수는 범위 내에서 직접 호출할 수 있습니다. 중첩된 함수는 캡슐화, 재사용성 및 범위 제어를 향상시킵니다. 그러나 내부 함수는 외부 함수의 로컬 변수에 직접 액세스할 수 없으며 반환 값 유형은 외부 함수 선언과 일치해야 합니다.
