범위 중첩은 범위 체인을 형성하고, 함수 중첩은 클로저를 형성합니다. 클로저와 범위 체인은 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의 현재 값)가 내부 함수의 상태의 일부가 되어 저장됩니다.

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中的常见锁类型,如何正确使用它们,以及如何避免竞争和死锁等问题。在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为”互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。Linux实现的互斥锁机制包括POSIX互斥锁和内核互斥锁,本文主要讲POSIX互斥锁,即线程间互斥锁。信号量用在多线程

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

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

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

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

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

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


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

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

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

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

Dreamweaver Mac版
시각적 웹 개발 도구

뜨거운 주제



