1. 함수 범위
1. 함수 범위
이는 범위가 "함수"에 있으며이 함수에 속하는 모든 변수를 전체 함수 범위 내에서 사용하여 다중화 할 수 있음을 의미합니다.
함수 foo (a) {var b = 2; function bar () {// ...} var c = 3;} bar (); // 실패한 console.log (a, b, c); // 세 가지 모두 실패했습니다위의 "FOO"기능의 여러 식별자가 함수 외부에 배치되어 액세스하는 경우보고됩니다.
2. 함수 표현식을 즉시 실행하십시오
코드 스 니펫 외부에 래퍼 함수를 추가하면 내부 변수 및 기능 정의를 "숨기기"할 수 있으며 외부 스코프는 래퍼 함수 내부에 아무것도 액세스 할 수 없습니다.
예를 들어, 위의 막대, A 및 기타 식별자. 이것은 변수를 오염으로부터 보호합니다.
플러그인을 작성할 때는 종종 즉시 기능 표현을 실행하여 내부 변수를 보호합니다.
var a = 2; (함수 foo () {var a = 3; console.log (a); // 3}) (); console.log (a); // 2"foo"의 첫 번째 ()는 함수를 표현식으로 바꾸고 두 번째 () 은이 함수를 실행합니다.
특별 용어가 있습니다 : iife는 즉시 호출 된 기능 표현을 나타냅니다.
1. 고급 사용량은이를 함수로 호출하고 매개 변수를 전달하는 것입니다.
(기능 iife (Global) {var a = 3; console.log (a); // 3console.log (global.a); // 2}) (창);2. 변화하는 목적은 CMD 또는 AMD 프로젝트에서 널리 사용되는 코드의 실행 순서를 뒤집는 것입니다.
(기능 iife (공장) {factory (창);}) (함수 def (global) {var a = 3; console.log (a); // 3console.log (Global.a); // 2});2. 블록 스코프
JavaScript는 블록 범위를 지원하지 않습니다.
for (var i = 0; i <10; i ++) {console.log (i);}위 코드의 "i"는 다음과 같습니다.
var i; for (i = 0; i <10; i ++) {console.log (i);}그러나 "시도/캐치"라는 예외가 있습니다. 캐치는 블록 범위입니다.
try {undefined (); // 예외를 강제하기 위해 불법 작업을 실행} catch (err) {console.log (err); // 정상적으로 실행할 수 있습니다! } console.log (err); // referenceError : err를 찾을 수 없습니다ES6은 현 상태를 변경하고 새로운 LET 키워드를 도입하여 변수를 모든 범위에 바인딩 할 수 있습니다 (일반적으로 {..}). 다시 말해, 선언 된 변수는 암시 적으로 블록 범위에 놓여 있습니다.
3. 개선
함수 범위 및 블록 범위의 동작은 동일하며 다음과 같이 요약 할 수 있습니다. 스코프 내에서 선언 된 모든 변수는이 범위에 첨부됩니다.
1) 컴파일 및 실행
변수 및 함수의 모든 선언은 코드가 실행되기 전에 먼저 처리됩니다. 다음 코드 예제를 볼 수 있습니다.
a = 2; var a; console.log (a); // 2
이 코드는 다음과 같습니다.
var a; // 정의 선언은 컴파일 단계에서 수행됩니다.
2) 기능 우선 순위
함수가 먼저 홍보 된 다음 변수가됩니다.
foo (); // 1var foo; function foo () {console.log (1);} foo = function () {console.log (2);};var foo 함수 표현식은 함수 선언 foo ()가 비록 복제 선언 (따라서 무시)이지만, 함수 선언이 정상 변수 전에 홍보되기 때문에 중복 선언입니다.
위의 코드는 다음과 같습니다.
함수 foo () {console.log (1);} foo (); // 1foo = function () {console.log (2);};4. 폐쇄
클로저는 다른 함수 범위에서 변수에 액세스 할 수있는 함수를 나타냅니다. 클로저를 생성하는 가장 일반적인 방법은 하나의 함수 내에서 다른 함수를 만드는 것입니다.
다른 함수를 통해이 함수의 로컬 변수에 액세스하면 클로저를 사용하여 액션 체인 도메인을 뚫고 함수 내부의 변수와 메소드를 통과 할 수 있습니다.
폐쇄 기능 :
1. 기능은 본질적으로 중첩됩니다
2. 내부 함수는 외부 매개 변수와 변수를 참조 할 수 있습니다.
3. 가비지 수집 메커니즘에 의해 매개 변수와 변수가 수집되지 않습니다.
1) 정의
함수가 위치가있는 범위를 기억하고 액세스 할 수있는 경우 기능이 현재 범위 외부에서 실행 되더라도 폐쇄가 생성됩니다.
함수 foo () {var a = 2; function bar () {console.log (a);} return bar;} var baz = foo (); baz (); // 2 - 이것은 폐쇄의 효과입니다.1. 함수 "bar"를 "baz"에 할당하고 "baz"를 실행하십시오. 현재 범위는 "바"범위에 있지 않지만 실행할 수 있습니다.
2. 폐쇄는 또한 쓰레기 수집을 방지합니다. "foo"가 실행되면 내부 범위가 여전히 존재합니다. 이런 식으로 "BAZ"를 실행할 수 있습니다.
2) 함수를 매개 변수로 전달합니다
함수 foo () {var a = 2; 함수 baz () {console.log (a); // 2} bar (baz);} 함수 바 (fn) {fn (); // 이것은 폐쇄입니다! }내부 함수 BAZ를 막대로 전달 하고이 내부 함수 (FN)라고 불리면 FOO ()의 내부 범위의 폐쇄가 a에 액세스 할 수 있으므로 관찰 될 수 있습니다.
기능을 첫 번째 레벨에서 값 유형으로 취급하고 어디에나 전달하면 이러한 기능에서 폐쇄의 적용을 볼 수 있습니다.
타이머, 이벤트 청취자, AJAX 요청, 교차 창의 커뮤니케이션, 웹 워커 또는 기타 비동기식 (또는 동기) 작업에서 콜백 기능이 사용되는 한 실제로 클로저를 사용하고 있습니다!
3) 루프 및 폐쇄
for (var i = 1; i <= 5; i ++) {settimeout (function timer () {console.log (i);}, i * 1000);}인쇄 할 때마다 6이되고 지연 함수의 콜백은 루프 끝에서만 실행됩니다.
범위가 어떻게 작동하는지에 따르면, 현실은 루프의 5 가지 기능이 각 반복마다 별도로 정의되지만 모두 공유 된 글로벌 범위로 둘러싸여 있으므로 실제로는 하나만 있습니다.
이제 클로저를 사용하여 매번 다른 I 인쇄를 구현하십시오.
for (var i = 1; i <= 5; i ++) {(function (j) {settimeout (function timer () {console.log (j);}, j * 1000);}) (i);}iife는 즉시 함수를 선언하고 실행하여 스코프를 만듭니다. Settimeout의 콜백은 현재 범위를 기억할 수 있으며 각 범위의 매개 변수 "j"는 다릅니다.
위의 내용은 편집자가 귀하에게 소개하는 JavaScript에서 가장 혼란스러운 범위, 개선 및 폐쇄 지식에 대한 자세한 설명입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!