찾다
웹 프론트엔드JS 튜토리얼자바스크립트 스코프 사용법과 클로저에 대한 자세한 설명_기본지식

범위 중첩은 범위 체인을 형성하고, 함수 중첩은 클로저를 형성합니다. 클로저와 범위 체인은 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을 찾을 수 없으므로 정의되지 않음이 출력됩니다.
간단히 예를 들자면, 물건을 사려고 돈을 쓸 때 먼저 지갑을 만져보고, 없으면 아빠한테 달라고 하면 됩니다. 그거, 할아버지한테 물어봐도 돼... 그리고 당신의 아버지는 물건을 살 돈이 없으면 당신에게 와서 그것을 요구하지 않을 것입니다.

클로저

한 함수에서 다른 함수를 정의하는 것을 함수 중첩이라고 합니다. 함수의 중첩은 클로저를 형성합니다.

클로저와 범위 체인은 서로를 보완합니다. 함수의 중첩은 체인 관계에서 여러 범위를 생성할 뿐만 아니라 클로저를 형성합니다.



코드 복사

코드는 다음과 같습니다.functionbind(func, target) { return function() {
func.apply(target, 인수);
};
}



그럼 클로저를 어떻게 이해하나요?
외부 함수는 내장 함수에 접근할 수 없습니다외부 함수는 내장 함수의 매개변수와 변수에 접근할 수 없습니다

그러나 내장 함수는 외부 함수의 매개변수와 변수에 접근할 수 있습니다

즉, 내장 함수는 외부 함수

앞서 언급한 스코프 체인 예시를 살펴보겠습니다. 이번에는 클로저의 관점에서 이해해 보겠습니다.



코드 복사

코드는 다음과 같습니다.

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의 현재 값)가 내부 함수의 상태의 일부가 되어 저장됩니다.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
switch case 内变量的范围switch case 内变量的范围Feb 09, 2024 am 09:00 AM

packagemainimport"fmt"funcmain(){x:=10switchx{case0:y:='a'fmt.Printf("%c\n",y)case1://y='b'//thiscan'tcompile,y:='b'fmt.Printf("%c\n",y)default:y:=

Linux多线程编程锁详解:如何避免竞争和死锁Linux多线程编程锁详解:如何避免竞争和死锁Feb 11, 2024 pm 04:30 PM

在Linux多线程编程中,锁是一种非常重要的机制,可以避免线程间的竞争和死锁。然而,如果不正确使用锁,可能会导致性能下降和不稳定的行为。本文将介绍Linux中的常见锁类型,如何正确使用它们,以及如何避免竞争和死锁等问题。在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为”互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。Linux实现的互斥锁机制包括POSIX互斥锁和内核互斥锁,本文主要讲POSIX互斥锁,即线程间互斥锁。信号量用在多线程

详解Golang函数中的变量作用域详解Golang函数中的变量作用域Jan 18, 2024 am 08:51 AM

Golang函数中的变量作用域详解在Golang中,变量的作用域指的是变量的可访问范围。了解变量的作用域对于代码的可读性和维护性非常重要。在本文中,我们将深入探讨Golang函数中的变量作用域,并提供具体的代码示例。在Golang中,变量的作用域可以分为全局作用域和局部作用域。全局作用域指的是在所有函数外部声明的变量,即在函数之外定义的变量。这些变量可以在整

Python Lambda表达式:让编程变得更轻松Python Lambda表达式:让编程变得更轻松Feb 19, 2024 pm 09:54 PM

pythonLambda表达式是一个小的匿名函数,它可以将一个表达式存储在变量中并返回它的值。Lambda表达式通常用于执行简单的任务,这些任务可以通过编写一个单独的函数来完成,但Lambda表达式可以使代码更简洁和易读。Lambda表达式的语法如下:lambdaarguments:expressionarguments是Lambda表达式接收的参数列表,expression是Lambda表达式的体,它包含需要执行的代码。例如,以下Lambda表达式将两个数字相加并返回它们的和:lambdax,

掌握JavaScript函数的嵌套和作用域掌握JavaScript函数的嵌套和作用域Nov 03, 2023 pm 07:55 PM

掌握JavaScript函数的嵌套和作用域,需要具体代码示例在JavaScript编程中,函数是非常重要的概念。函数的嵌套和作用域能够极大地提高代码的可读性和灵活性。本文将介绍如何正确地使用嵌套函数和作用域,并提供具体的代码示例。函数的嵌套可以理解为在一个函数中定义了另一个函数。这种嵌套的方式能够将代码分成多个小块,使得程序的逻辑更加清晰。同时,嵌套函数还可

JavaScript const关键字的用法及作用JavaScript const关键字的用法及作用Feb 19, 2024 pm 06:30 PM

JavaScript中const的作用和用法JavaScript是一种广泛应用于网页开发的编程语言,其具有灵活性和动态性是其特点之一。在JavaScript中,我们可以使用const关键字来声明一个常量。本文将介绍const关键字的作用和用法,并提供一些具体的代码示例来帮助读者更好地理解。const的作用const(常量)是一种用于声明不可更改的变量的关键字

c语言static的作用和用法是什么c语言static的作用和用法是什么Jan 31, 2024 pm 01:59 PM

c语言static的作用和用法:1、变量作用域;2、生命周期;3、函数内部;4、修饰全局变量;5、修饰函数;6、其他用途;详细介绍:1、变量作用域,当一个变量前有static关键字,那么这个变量的作用域被限制在声明它的文件内,也就是说,这个变量是“文件级作用域”,这对于防止变量的“重复定义”问题很有用;2、生命周期,静态变量在程序开始执行时初始化一次,并在程序结束时销毁等等。

如何解决Python的变量未定义错误?如何解决Python的变量未定义错误?Jun 24, 2023 pm 10:12 PM

Python是一种高级编程语言,它的易用性和流行程度使得它成为了众多程序员的首选语言。与其他语言一样,Python也存在一些常见的错误类型,例如变量未定义错误。当我们在Python中使用一个未定义的变量时,程序就会抛出一个名为“NameError”的异常。这种错误通常出现在以下几种情况下:拼写错误:可能是因为变量名拼写错误导致了变量未定义错误,我们需要仔细检

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구