JavaScript 어휘 범위 및 개체_javascript 기술 호출에 대한 심층적인 이해
Javascript에서 함수 범위, 객체 호출 및 클로저 간의 관계는 매우 미묘합니다. 이에 대한 기사는 많이 있었지만 왜 많은 초보자가 이를 이해하는 데 어려움을 겪는지 모르겠습니다. 나는 더 대중적인 언어로 내 자신의 이해를 표현하려고 노력할 것입니다.
범위 범위
자바스크립트의 함수는 어휘 범위에 속합니다. 즉, 함수가 실행될 때가 아니라 정의된 범위에서 함수가 실행된다는 의미입니다. 이것이 코뿔소 책에 나오는 내용입니다. 그러나 어떤 사람들은 "정의될 때"와 "실행될 때(호출될 때)"라는 두 가지에 대해 혼동합니다. 간단히 말하면, 함수 A가 "정의"되면 함수 A(){}입니다. 명령문이 실행되면 함수가 정의되는 경우이고, A가 호출되는 경우는 명령문 A(입니다. )이 실행됩니다. 이 두 개념은 명확하게 구별되어야 합니다.
어휘적 범위(이하 별도로 지정하지 않는 한 '범위'라고 함)란 정확히 무엇인가요? 직설적으로 말하면 "scope"이고, 스코프(scope)는 영어로 범위(scope)를 의미합니다. 함수의 범위는 함수가 정의된 시점의 "범위"입니다. 즉, 외부 "범위"에는 외부 변수 속성이 포함됩니다. 이 "범위"는 함수의 내부 상태로 설정됩니다. 전역 함수가 정의되면 전역 함수(함수의 외부 계층)의 "범위"가 전역 함수의 내부 상태로 설정됩니다. 중첩 함수가 정의되면 중첩 함수(외부 함수)의 "범위"가 중첩 함수의 내부 상태로 설정됩니다. 이 "내부 상태"는 실제로 범위 체인으로 이해될 수 있습니다. 아래를 참조하세요.
위의 설명에 따르면 함수의 범위는 함수가 정의된 "범위"입니다. 그러면 Javascript의 함수 범위는 함수가 정의될 때 결정되므로 정적 범위입니다. 정적 범위라고도 합니다.
호출 개체
함수의 호출 개체는 동적이며 함수가 호출될 때 인스턴스화됩니다. 우리는 함수가 정의되면 범위 체인이 결정된다는 것을 이미 알고 있습니다. Javascript 인터프리터가 함수를 호출하면 범위 체인 앞에 새 개체(호출 개체)가 추가됩니다. 호출 객체의 속성은 함수의 실제 매개변수인 함수의 Arguments 객체를 참조하는 인수라는 속성으로 초기화됩니다. var 문으로 선언된 모든 지역 변수도 이 호출 개체에 정의됩니다. 이때 호출 객체는 스코프 체인의 선두에 있고 지역 변수, 함수 형식 매개변수, Arguments 객체는 모두 이 함수의 스코프 내에 있습니다. 물론 이때 지역 변수, 함수 형식 매개변수, Arguments 객체는 스코프 체인에서 같은 이름의 속성을 덮어씁니다.
범위, 범위 체인 및 호출 개체 간의 관계
내가 이해한 바에 따르면 범위는 추상적이고 호출 개체는 인스턴스화됩니다.
실제로 외부 함수가 실행될 때 함수가 정의되면 함수가 호출될 때 실제로 외부 함수의 호출 개체 체인이 결정되는 범위 체인은 범위를 기반으로 합니다. 정의 시 결정된 체인(외부 함수의 호출 개체 체인)과 인스턴스화된 호출 개체. 따라서 함수의 범위 체인은 실제로 호출 개체 체인입니다. 함수가 호출되면 해당 범위 체인(또는 호출 개체 체인)은 실제로 함수가 정의될 때 결정된 범위 체인의 상위 집합입니다.
그들 사이의 관계는 범위? 범위 체인? 호출 개체로 표현될 수 있습니다.
너무 복잡합니다. 예를 들어 보겠습니다.
function f(x) {
var g = function () { return x; }
return g
}
var g1 = f(1); g1()) ; //출력 1
전역 상황을 다음과 유사한 대규모 익명 함수로 간주한다고 가정합니다.
(function() {
//전역 범위입니다
} )();
그러면 예제는 다음과 같습니다:
(function() {
function f(x) {
var g = function () { return x; }
return g;
}
var g1 = f(1);
alert(g1()) //출력 1
})();
전역 대형 익명 함수를 정의하면 외부 레이어가 없으므로 범위 체인이 비어 있습니다.
전역 대형 익명 함수가 직접 실행되며 전역 스코프 체인에는 '전역 호출 개체'가 하나만 있습니다.
함수 f가 정의됩니다. 이때 함수 f의 범위 체인은 외부 범위 체인, 즉 '전역 호출 개체'입니다.
함수 f(1)이 실행되고, 그 스코프 체인은 새로운 f(1) 호출 객체와 함수 f가 정의되었을 때의 스코프 체인, 즉 'f(1) 호출 객체 -> 전역 호출 객체'입니다. .
함수 g(g1으로 반환됩니다. 이름을 g1로 지정하겠습니다)는 f(1)에 정의되어 있으며 해당 범위 체인은 외부 함수 f(1)의 범위 체인입니다. 즉, ' f(1 ) 호출 객체 -> 전역 호출 객체'.
함수 f(1)은 함수 g의 정의를 g1에 반환합니다.
함수 g1이 실행되고, 그 범위 체인은 새로운 g(1) 호출 객체에 외부 f(1)의 범위 체인을 더한 것입니다. 즉, 'g1 호출 객체->f(1) 호출 객체- >글로벌 호출 객체'.
이렇게 보면 아주 명확해집니다.
Closuer
클로저를 간단히 말하면 중첩 함수 외부에서 중첩 함수를 호출하면 클로저가 형성된다는 것입니다.
이전 예는 실제로 클로저입니다. g1은 f(1) 내부에 정의되어 있지만 f(1)이 반환된 후에 실행됩니다. 클로저의 효과 중 하나는 중첩 함수 f가 반환된 후 내부 리소스가 해제되지 않는다는 것입니다. g 함수가 외부에서 호출되면 g는 f의 내부 변수에 액세스할 수 있습니다. 이 기능을 바탕으로 우아한 코드를 많이 작성할 수 있습니다.
예를 들어 페이지에 통합 카운터를 만들고 싶은 경우 클로저를 사용하면 다음과 같이 작성할 수 있습니다.
var counter = (function() {
var i = 0;
var fns = {"get": function( ) {return i;},
"inc": function() {return i;}};
return fns;
})(); inc();
//다른 작업 수행
counter.inc();
var c_value = counter.get(); //이제 c_value는 2입니다.
방식으로, 하나는 메모리 변수 i에 유지되며, i의 값은 카운터의 두 가지 작업을 통해서만 전체 프로그램의 다른 곳에서 직접 조작될 수 없습니다.
console.log('i:' i " 지연:" 지연);
}
이렇게 하면 인쇄된 값이 모두
i:5 지연:6000
i:5 지연:6000이 됩니다.
i:5 지연:6000
i:5 지연:6000
대신 클로저를 사용하면 전달할 매개변수를 쉽게 바인딩할 수 있습니다.
console.log('i:' a " Delay:" _delay);
}, _delay);
}) (i, 지연)
}
출력:
i:0 지연:1000
i:2 지연:3000
i:3 지연:4000
i:4 지연:5000
클로저는 이벤트 콜백 함수를 바인딩할 때도 일반적으로 사용됩니다. 같은 이유로 바인딩된 함수 핸들은 매개변수로 사용할 수 없지만 매개변수는 클로저 형태로 바인딩될 수 있습니다.
요약
함수의 어휘 범위와 범위 체인은 서로 다릅니다. 어휘 범위는 추상적인 개념이고 범위 체인은 인스턴스화된 호출 개체의 체인입니다. 함수가 정의되면 외부 함수가 실행될 때도 마찬가지입니다. 함수의 어휘 범위는 정의할 때 결정되지만 여전히 추상적인 개념이므로 인스턴스화할 수 없고 인스턴스화할 수도 없습니다.
함수가 정의되면 인스턴스화되는 외부 함수의 범위 체인도 결정됩니다.
함수를 여러 번 호출하면 범위 체인이 달라집니다.
폐쇄는 강력합니다. Rhinoceros 책이 맞습니다. 이러한 내용을 이해한다면 스스로를 고급 Javascript 프로그래머라고 부를 수 있습니다. 이러한 개념을 잘 활용하면 Javascript의 다양한 디자인 패턴을 다룰 수 있기 때문입니다.

핫 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)

Python을 사용하여 Baidu Map API를 호출하여 지리적 위치 쿼리 기능을 구현하는 방법은 무엇입니까? 인터넷의 발달로 지리적 위치정보의 획득과 활용이 점점 더 중요해지고 있다. Baidu Maps는 다양한 지리적 위치 쿼리 서비스를 제공하는 매우 일반적이고 실용적인 지도 애플리케이션입니다. 이 글에서는 Python을 사용하여 Baidu Map API를 호출하여 지리적 위치 쿼리 기능을 구현하는 방법을 소개하고 코드 예제를 첨부합니다. 바이두 지도 개발자 계정 및 애플리케이션 신청 먼저 바이두 지도 개발자 계정이 있어야 하고 애플리케이션을 만들어야 합니다. 로그인

PHP 카메라 호출 기술: 여러 대의 카메라 간을 전환하는 방법 카메라 애플리케이션은 화상 회의, 실시간 모니터링 등과 같은 많은 웹 애플리케이션에서 중요한 부분이 되었습니다. PHP에서는 다양한 기술을 사용하여 카메라를 호출하고 작동할 수 있습니다. 이 기사에서는 다중 카메라 전환을 구현하는 방법에 중점을 두고 독자의 이해를 돕기 위해 몇 가지 샘플 코드를 제공합니다. 카메라 호출의 기본 PHP에서는 JavaScript API를 호출하여 카메라를 호출할 수 있습니다. 구체적으로 우리는

웨지 우리는 객체가 두 가지 주요 방법으로 생성된다는 것을 알고 있습니다. 하나는 Python/CAPI를 사용하는 것이고, 다른 하나는 유형 객체를 호출하는 것입니다. 내장 유형의 인스턴스 객체의 경우 두 가지 방법이 모두 지원됩니다. 예를 들어 목록은 [] 또는 list()를 통해 생성할 수 있으며 전자는 Python/CAPI이고 후자는 호출 유형 객체입니다. 그러나 사용자 정의 클래스의 인스턴스 객체의 경우 유형 객체를 호출해야만 생성할 수 있습니다. 객체를 호출할 수 있으면 해당 객체는 호출 가능하고, 그렇지 않으면 호출할 수 없습니다. 객체가 호출 가능한지 여부는 해당 유형 객체에 메서드가 정의되어 있는지 여부에 따라 결정됩니다. 좋다

PHP 개발에서 외부 리소스에 액세스하고 호출하는 문제를 해결하려면 특정 코드 예제가 필요합니다. PHP 개발에서는 API 인터페이스, 타사 라이브러리 또는 기타 서버 리소스와 같은 외부 리소스에 액세스하고 호출해야 하는 상황에 자주 직면합니다. . 이러한 외부 리소스를 처리할 때 성능과 안정성을 보장하면서 안전하게 액세스하고 호출하는 방법을 고려해야 합니다. 이 문서에서는 몇 가지 일반적인 솔루션을 설명하고 해당 코드 예제를 제공합니다. 1. 컬 라이브러리를 사용하여 외부 리소스를 호출합니다. 컬은 매우 강력한 오픈 소스 라이브러리입니다.

Python 프로그래밍을 통해 Baidu Map API를 호출하여 지도 표시 기능을 구현하는 방법은 무엇입니까? 인터넷의 급속한 발전으로 지도 애플리케이션은 우리 삶에 없어서는 안 될 부분이 되었습니다. 중국 최대 지도 애플리케이션 중 하나인 Baidu 지도는 지도 표시 기능을 쉽게 실현할 수 있는 풍부한 서비스와 API 인터페이스를 제공합니다. 이 기사에서는 Python 프로그래밍을 통해 Baidu Map API를 호출하여 지도 표시 기능을 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다. 먼저, 우리는

아직 matlab에서 m 파일을 호출하는 방법을 모르는 친구들이 많으므로, 아래 에디터에서 matlab에서 m 파일을 호출하는 방법을 설명하고 있으니, 꼭 참고해 보시기 바랍니다. 1. 먼저 MATLAB 소프트웨어를 열고 아래 그림과 같이 메인 인터페이스에서 "열기"를 클릭합니다. 2. 그런 다음 열려고 하는 m 파일을 선택하고 아래 그림과 같이 열기를 선택합니다. 3. 그런 다음 아래 그림과 같이 편집기에서 m 파일의 파일 이름과 변수 개수를 확인합니다. 4. 아래 그림과 같이 명령줄에 m 파일 이름과 괄호 안에 변수 값을 입력하여 호출할 수 있습니다. 5. 마지막으로 아래 그림과 같이 m 파일을 성공적으로 호출할 수 있습니다. 위는 편집자가 가져온 matlab에서 m 파일을 호출하는 방법에 대한 전체 설명입니다.

Java를 사용하여 WebService를 호출하는 방법 단계에는 특정 코드 예제가 필요합니다. 웹 서비스는 네트워크를 통해 다양한 기능을 제공하는 웹 기반 응용 프로그램 인터페이스입니다. Java 개발에서는 다른 시스템과 상호 작용하기 위해 웹 서비스를 사용해야 하는 경우가 많습니다. 이 기사에서는 Java를 사용하여 WebService를 호출하는 방법을 소개하고 특정 코드 예제를 제공합니다. 1. WebService 이해 WebService는 XML 형식을 사용하는 표준화된 통신 프로토콜입니다.

PHP를 통해 번호판 인식을 위해 카메라를 호출하는 방법 소개: 지속적인 기술 개발로 번호판 인식 기술은 교통 관리, 보안 모니터링 및 기타 분야에서 중요한 역할을 합니다. 이 기사에서는 PHP를 사용하여 카메라를 호출하여 번호판 인식 기능을 구현하는 프로그램을 작성하는 방법을 소개합니다. 1. 개요 번호판 인식 기술은 주로 이미지 처리 및 기계 학습 알고리즘을 포함합니다. 기존의 번호판 인식 솔루션은 C++ 또는 Python과 같은 프로그래밍 언어를 사용하여 개발되었습니다. 그러나 PHP는 웹 개발에 널리 사용되는 스크립팅 언어이기 때문에 개발자는
