찾다
웹 프론트엔드JS 튜토리얼JavaScript_javascript 기술의 var 선언의 변수 범위 추론에 대해

1. 신화! 코드 조각으로 인한 의심
다음 코드를 살펴보십시오.
코드 복사 코드는 다음과 같습니다. 다음과 같습니다:

for(var i=0;iconsole.log(j "," k)
for(var j=0; jvar k = j
}
}
console.log(i)

출력 결과:
정의되지 않음 ,undefine
3, 3
3,3
3
C, Java 및 기타 언어로 작업하는 경우 j 및 k와 같은 지역 변수에 외부 코드로 액세스할 수 있는 이유가 궁금할 수 있습니다. 범위?
JavaScript에서 var로 선언된 변수를 지역 변수로 간주할 수 있다면 변수에 접근할 수 있는 범위는 변수의 지역 범위입니다. 위의 예에서와 같이 console.log 줄에는 여전히 j와 k의 범위가 있고 루프 외부에는 여전히 i의 범위가 있습니다. 이 시점에서 JavaScript에는 실제 로컬 범위가 없다고 임의로 말할 수 있습니다. 정말? 아니요!

2. 실제 로컬 범위를 얻는 방법은 무엇입니까? 글쓰기 방법이 눈길을 끌었습니다
JQuery의 소스코드나 Ext의 소스코드를 보신 적이 있으시다면, 다음의 작성방법이 조금 익숙하실 것입니다.
코드 복사 코드는 다음과 같습니다.

var a = 3,b=4;
var imports = (function() {
var a = 1,b=2;
return {a:a,b:b};
})()
콘솔. log(" " a "," b);
console.log(exports.a ","exports.b)

출력 결과:
3,4
1,2
함수 내부에 독립적인 범위가 있다는 것은 매우 놀라운 발견입니다(실제로는 놀라운 일이 아닙니다. 모두가 알고 있습니다). 즉, 함수 내부에서 var로 선언된 변수는 함수 내부에서만 사용할 수 있습니다. 기능. 따라서 각 프레임워크의 모든 마스터는 지역 변수와 외부 변수(외부 지역 변수와 전역 변수) 간의 충돌을 방지하기 위해 이렇게 작성합니다.
이 시점에서 첫 번째 기사에서 임의의 추론을 철회하고 수정합니다.
JavaScript는 함수로 제한되며 각 함수는 다른 블록(일반 코드 블록, for 루프, If 포함)을 갖습니다. , while 및 기타 코드 블록)에는 로컬 범위가 없습니다. var를 사용하여 선언된 변수는 이러한 코드 블록을 직접 통과할 수 있으며 외부 코드에서 액세스할 수 있습니다.


3. 오류는 언제 보고되고 언제 정의되지 않나요? var의 선언 메커니즘
코드 보기:
코드 복사 코드는 다음과 같습니다. 🎜>
console.log(a)

출력 결과:
ReferenceError: a가 정의되지 않았습니다
출력 결과:
정의되지 않음

코드 복사 코드는 다음과 같습니다.
var imports = (function() {
var a = 1,b=2;
return {a:a,b:b};
})()
console.log(a);

출력 결과:
ReferenceError: a가 정의되지 않았습니다.
추측:
JavaScript 엔진이 코드를 실행할 때마다 먼저 범위에 있는 모든 코드를 검색합니다(범위에 있는 함수 내부의 코드는 검색되지 않습니다). var에 의해 선언된 모든 변수를 기록합니다. 코드가 실행되고 할당되기 전에는 이러한 변수의 값이 정의되지 않습니다. 그 후 변수에 접근하게 되면 먼저 지역 변수에 접근하게 되고, 해당 지역 변수가 없다면 상위 수준의 지역 변수(클로저 등)에 접근하게 되고, 상위 수준에서는 이에 대한 환경을 생성하게 됩니다. 클로저) 전체 전역 변수에 액세스할 때까지. 해당 변수가 없으면 예외가 발생합니다.



4. 여담: 클로저가 비동기식이며 변수 값이 엉망입니다! 비동기 상황에서 지역 변수의 현재 값 전송을 보장하는 방법은 무엇입니까?
코드에 대해 이야기해보자:

코드 복사 코드는 다음과 같다:
for( var i=0;isetTimeout(function() {
console.log(i);
},1)
}

출력 결과:
3
3
3
왜? 왜냐하면 클로저가 비동기적으로 실행될 때 i는 항상 외부 범위에서 i에 액세스하기 때문입니다. 비동기식이므로 클로저가 실행될 때 루프가 종료되고 i는 이미 3이므로 인쇄될 때마다 3입니다.
그렇다면 이 문제를 어떻게 해결할 수 있을까요? i를 지역 변수로 변환해야 합니다.
글쎄, 이런 식으로 쓰는 사람이 있습니다.

코드 복사 코드는 다음과 같습니다.
for(var i=0;ivar j = i;
setTimeout(function() {
console.log(j);
}, 1)
}


출력 결과:
2
2
2
왜?
실제로 앞서 설명했듯이 j와 i의 범위는 실제로 동일합니다. 모두 외부 지역 변수입니다. 비동기 상황에서 루프 실행이 완료되면 j는 2입니다(i는 i보다 1 작습니다).
어떻게 해야 할까요? (광고를 상상해 보세요, (∨v⋅)).
우리 모두 알고 있듯이 함수의 매개변수도 함수의 지역 변수로 간주됩니다. 그래서 여기에 지역 변수를 함수의 실제 매개변수로 변환하여 값 전달 효과를 얻는 방법이 있습니다.
코드 복사 코드는 다음과 같습니다.

for(var i=0;isetTimeout((
function(j){
return function() {
console.log(j);
}
})(i)
, 1);
}

출력
0
1
2
사실 너무 많이 말하면 글을 쓰고 나면 거의 이해가 되실 겁니다. 코드를 사용하세요. 이 익명 함수 메서드는 비동기 상황에서 변수 변경 문제를 제거하지만 이는 이 게시물에서 벗어난 것입니다.

요약:
음. 더 이상 쓰지 않겠습니다. 너무 게을러서 언젠가 시간을 내서 정리하겠습니다. 안녕-안녕.
사실 이러한 결론은 RFC에 작성되어야 합니다. 그런데 영어 문서를 씹는 거죠. . . 잊어버리세요. . 나는 그것을 스스로 추론했다. 하하, 그거 보고 웃지 마세요.
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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中,变量的作用域可以分为全局作用域和局部作用域。全局作用域指的是在所有函数外部声明的变量,即在函数之外定义的变量。这些变量可以在整

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

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

在 Windows 11 上修复音频服务无响应问题的 18 种方法在 Windows 11 上修复音频服务无响应问题的 18 种方法Jun 05, 2023 pm 10:23 PM

音频输出和输入需要特定的驱动程序和服务才能在Windows11上按预期工作。这些有时最终会在后台遇到错误,从而导致音频问题,如无音频输出、缺少音频设备、音频失真等。如何修复在Windows11上没有响应的音频服务我们建议您从下面提到的修复开始,并逐步完成列表,直到您设法解决您的问题。由于Windows11上的多种原因,音频服务可能无法响应。此列表将帮助您验证和修复阻止音频服务在Windows11上响应的大多数问题。请按照以下相关部分帮助您完成该过程。方法一:重启音频服务您可能会遇

一起聊聊var、let以及const的区别(代码示例)一起聊聊var、let以及const的区别(代码示例)Jan 06, 2023 pm 04:25 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要给大家介绍了var、let以及const的区别有哪些,还有ECMAScript 和 JavaScript的关系介绍,感兴趣的朋友一起来看一下吧,希望对大家有帮助。

PHP中var关键字的作用和示例PHP中var关键字的作用和示例Jun 28, 2023 pm 08:58 PM

PHP中var关键字的作用和示例在PHP中,var关键字用于声明一个变量。以前的PHP版本中,使用var关键字是声明成员变量的惯用方式,现在已经不再推荐使用。然而,在某些情况下,var关键字依然会被使用。var关键字主要用于声明一个局部变量,并且会自动将该变量标记为局部作用域。这意味着该变量仅在当前的代码块中可见,并且不能在其他函数或代码块中访问。使用var

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

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

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를 무료로 생성하십시오.

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

mPDF

mPDF

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

PhpStorm 맥 버전

PhpStorm 맥 버전

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

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구