고급 JavaScript 스코프 및 컨텍스트
JavaScript의 범위는 변수의 접근성 범위를 결정하며, 이는 글로벌, 기능 및 블록 수준 범위로 나뉩니다. 컨텍스트는 이것의 방향을 결정하고 함수 호출 방법에 따라 다릅니다. 1. 스코프에는 글로벌 범위 (어디서나 액세스 가능), 함수 스코프 (함수 내에서만 유효 함) 및 블록 레벨 범위 ({} 내에서 유효 함)가 포함됩니다. 2. 실행 컨텍스트에는 가변 객체, 범위 체인 및 이것의 값이 포함되어 있습니다. 이것은 일반 함수에서 글로벌 또는 정의되지 않은 것을 가리키며, 메소드 호출 포인트는 호출 객체를 가리키며 생성자는 새 객체를 가리키며 Call/Apply/Bind에 의해 명시 적으로 지정 될 수 있습니다. 3. 폐쇄는 외부 범위 변수에 액세스하고 기억하는 기능을 말합니다. 그들은 종종 캡슐화 및 캐시에 사용되지만 메모리 누출을 유발할 수 있습니다. 4. 콜백 함수에서 컨텍스트 손실이 일반적이며 솔루션에는 바인딩, 생성자 바인딩 또는 화살표 기능 사용이 포함됩니다.
JavaScript의 범위와 컨텍스트는이 언어의 행동을 이해하는 데 핵심이지만 종종 혼란스러워집니다. 스코프는 변수의 접근성을 결정하는 반면 컨텍스트는 this
포인팅하는 것을 결정합니다. 둘 사이의 차이점과 메커니즘을 마스터하면 더 명확하고 안정적인 코드를 작성하는 데 도움이 될 수 있습니다.

범위 : 액세스 할 수있는 변수의 범위
JavaScript에서 스코프는 변수에 액세스 할 수 있는지 여부를 결정합니다. 가장 일반적인 세 가지 범위는 다음과 같습니다.
- 글로벌 범위 : 어디서나 액세스 할 수 있습니다.
- 함수 스코프 (로컬 스코프) :이를 정의하는 함수 내부에서만 유효합니다.
- 블록 레벨 스코프 (ES6에 의해 소개 됨) :
let
andconst
, 유효한 내부{}
에 의해 정의됩니다.
예를 들어:

if (true) { blockvar = '나는 블록 스코프다'; } console.log (blockvar); // 오류 : BlockVar는 정의되지 않았습니다
여기에서 사용 let
변수는 if
블록에만 존재합니다. var
로 변경되면 기능 또는 글로벌 범위로 홍보됩니다.
스코프 체인은 함수의 변수에 액세스 할 때 JavaScript가 먼저 현재 범위 에이 변수가 있는지 확인합니다. 그렇지 않다면 글로벌 범위까지 찾아보십시오.

실행 컨텍스트 vs. 이것 : 함수가 실행될 때 "환경"
실행 컨텍스트는 JavaScript가 코드를 실행할 때 내부 환경입니다. 함수가 호출 될 때마다 새로운 실행 컨텍스트가 생성됩니다. 세 부분이 포함되어 있습니다.
- 가변 객체 (VO)
- 스코프 체인
-
this
의 가치
요점은 this
입니다. 그 가치는 그 가치가 기록되지 않았지만 함수가 호출되는 방식에 따라 다릅니다.
몇 가지 일반적인 상황 :
- 일반 기능 호출 :
this
글로벌 객체를 가리 킵니다 (브라우저의window
, 엄격한 모드에서undefined
) - 방법 호출 :
this
그것을 호출하는 객체를 가리 킵니다. - 생성자 호출 :
this
새로 생성 된 객체를 가리 킵니다 -
call
/apply
/bind
사용 :this
명시 적으로 지정됩니다.
예를 들어:
const user = { 이름 : 'Tom', 인사 : function () { console.log (`hello, $ {this.name}`); } }; user.greet (); // output Hello, Tom,이 점은 사용자 객체에
폐쇄 : 출생의 범위를 기억하십시오
클로저는 다른 함수 범위에서 변수에 액세스 할 수있는 권한이있는 함수입니다. 간단히 말해서, 그것은 정의 된 환경을 기억하는 기능입니다.
예를 들어:
함수 외부 () { count = 0을하자; 반환 함수 내부 () { 세다 ; Console.log (count); }; } const counter = OUTER (); 계수기(); // 출력 1 계수기(); // 출력 2
inner
함수는 count
변수에 대한 참조를 유지하는 폐쇄를 형성합니다. outer
실행 되더라도 쓰레기 수집 메커니즘으로 count
제거되지 않습니다.
클로저는 종종 데이터, 캐시, 모듈화 및 기타 시나리오를 캡슐화하는 데 사용되지만 메모리 누출이 발생하기 쉽습니다. 사용할 때 쓸모없는 참조를 청소하는 데주의를 기울이십시오.
컨텍스트 손실 문제 : 공통점
실제 개발에서, this
의 맥락은 특히 콜백 함수 또는 이벤트 처리에서 쉽게 "손실"됩니다.
예를 들어:
const button = document.querySelector ( 'button'); button.addeventListener ( 'click', user.greet); // 오류 가보고되고, 이름은 정의되지 않았습니다
현재 greet
방법은 콜백으로 전달되며 this
이상 user
에게 가리키지 않습니다. 해결책은 컨텍스트를 바인딩하는 것입니다.
-
.bind(this)
사용 - 생성자에 바인딩
- 화살표 함수 사용 (화살표 기능이
this
으로 바인딩되지 않기 때문에)
button.adeventListener ( 'click', user.greet.bind (user));
기본적으로 그게 다야. 범위와 컨텍스트는 개념적으로 추상적이지만 특정 호출 방법과 결합 된 한 이해하기가 어렵지 않습니다. 열쇠는 함수가 호출되는 방법과 변수가 정의되는 위치에 대해 더 많이 관찰하는 것입니다.
위 내용은 고급 JavaScript 스코프 및 컨텍스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

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

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

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

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

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

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

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

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

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

스마트 포인터는 힙 메모리 개체를 자동으로 해제하고 메모리 오류를 방지할 수 있는 C++ 관련 포인터입니다. 유형은 다음과 같습니다: Unique_ptr: 독점 소유권, 단일 객체를 가리킵니다. shared_ptr: 공유 소유권으로, 여러 포인터가 동시에 객체를 관리할 수 있습니다. Weak_ptr: 약한 참조, 참조 횟수를 늘리지 않고 순환 참조를 방지합니다. 사용법: std 네임스페이스의 make_unique, make_shared 및 make_weak를 사용하여 스마트 포인터를 만듭니다. 스마트 포인터는 범위가 끝나면 자동으로 개체 메모리를 해제합니다. 고급 사용법: 사용자 정의 삭제자를 사용하여 객체가 해제되는 방식을 제어할 수 있습니다. 스마트 포인터는 동적 배열을 효과적으로 관리하고 메모리 누수를 방지할 수 있습니다.

C 언어 함수 이름 정의에는 다음이 포함됩니다. 반환 값 유형, 기능 이름, 매개 변수 목록 및 기능 본문. 키워드와의 충돌을 피하기 위해 기능 이름은 명확하고 간결하며 스타일이 통일되어야합니다. 기능 이름에는 범위가 있으며 선언 후 사용할 수 있습니다. 함수 포인터를 사용하면 기능을 인수로 전달하거나 할당 할 수 있습니다. 일반적인 오류에는 명명 충돌, 매개 변수 유형의 불일치 및 선언되지 않은 함수가 포함됩니다. 성능 최적화는 기능 설계 및 구현에 중점을두고 명확하고 읽기 쉬운 코드는 중요합니다.

Vue에서는 let과 var 사이에 변수를 선언할 때 범위에 차이가 있습니다. 범위: var에는 전역 범위가 있고 let에는 블록 수준 범위가 있습니다. 블록 수준 범위: var는 블록 수준 범위를 생성하지 않으며, 블록 수준 범위를 생성합니다. 재선언: var는 동일한 범위에 있는 변수의 재선언을 허용하지만 let은 허용하지 않습니다.
