폐쇄와 작용역을 다시 깊이 연구하다

1575 단어
최근에 재미있는 함수를 봤어요.
        function test (arr) {
            var temp = []
            for (var i =0;  i 
 

그러면 다음 결과는 무엇을 출력합니까?
var arr = [1,2,3,4,5]
var arrFn = test(arr)
console.log(arrFn[0])  

결과: 0;
그럼 계속 테스트 함수를 다음 두 가지로 바꾸면 어떤 결과가 나올까요?
        function test2 (arr) {
            var temp = []
            for (var i =0;  i 
 
        function test3 (arr) {
            var temp = []
            for (var i =0;  i 
 

test2는 인터넷에서 비교적 흔히 볼 수 있는 것으로 그 결과 우리가 i를 읽을 때 i는 이미 모두 5로 변했다.test3과test는 두 줄의 코드만 다르지만 결과는 완전히 다르다.
이전에 이해한 바와 같이 우리가 호출할 때 for순환이 이미 실행되었기 때문에 i를 5로 받을 수 있다.그러나 사실 이것은 표상일 뿐이다. 가장 핵심적인 것은 한마디뿐이다.
패키지를 닫으면 값이 아닌 인용을 통해 외부 변수를 가져옵니다.
인용 형식이기 때문에 for가 실행된 후에 i는 5로 바뀌고 인용 형식도 5로 바뀐다.
테스트에 검증할 수 있는 코드를 추가한 것은 다음과 같습니다.
var j = i;

국부적 역할 영역에서 비인용 형식을 성명함으로써 단일 순환 예인용 형식을 저장하면 우리가 원하는 결과를 얻을 수 있습니다.
또한 자체 실행 함수를 통해 매개변수를 전달하여 참조 유형을 비 참조 유형으로 변경하는 방법도 있습니다.
        function test4 (arr) {
            var temp = []
            for (var i =0;  i 
 

그 다음은 IIFE로 국부 작용역을 만들 때 더 이상 작용역 외부에서break와continue를 사용해서는 안 된다는 것을 주의해야 한다. 이런 작법은 합법적이지 않다.

좋은 웹페이지 즐겨찾기