이 코드는 Ruan Yifeng 선생님이 쓴 es6 책에 나와 있습니다. 텍스트 설명에 y의 x와 var x = 3이 다르다고 나와 있습니다. 여기. 그런 다음 var x= 3의 var를 제거하면 2가 출력될 수 있는데 이는 더욱 이해하기 어렵습니다. . . 답변이 있기를 바랍니다
이에는 실제로 ES6 기본 매개변수에 의해 도입된 중간 범위가 포함됩니다. Ruan Yifeng도 처음에 이 문제를 놓쳤지만, 물론 여기서는 맞습니다.
중간 범위의 목적은 기본 매개변수가 함수의 변수에 의해 오염되는 것을 방지하는 것입니다. 기본 매개변수의 원래 의도는 매개변수가 기본값을 갖도록 허용하는 것입니다. 함수 내부의 변수를 늘릴 수 있으면 기본 매개변수는 의미가 없습니다. 구체적인 설명과 예는 기사를 참조하세요.
y()는 전역 x가 아닌 foo 함수의 매개변수 x를 수정합니다. (여기서 y()를 호출한 후 console.log(x)를 사용하여 전역 x가 여전히 1임을 확인할 수 있습니다.) 문제는 간단합니다. 1) var x = 3을 사용하면 console.log(x in foo )가 인쇄됩니다. foo의 지역 변수 x, y()는 매개 변수 x만 수정하므로 최종 출력은 지역 변수 x = 3 2) var가 사용되지 않으면 foo의 모든 x는 매개 변수 x를 가리키고 y는 사용됨() 매개변수 x를 2로 변경하고 최종적으로 2를 출력합니다
이것은 지역 변수와 전역 변수의 수명주기의 차이점입니다. 메소드의 var x = 3은 지역 변수가 메소드 본문에서 사용되지만 전역 변수입니다. 사용되지 않으므로 출력은 var x = 3; var x = 3;의 var를 제거하면 x의 값입니다. 즉, 전역 변수는 메서드에 정의된 다른 지역 변수가 없음을 의미합니다. 출력은 2입니다.
먼저 var 연산자의 정의를 이해해야 합니다. var 연산자로 정의된 변수는 해당 변수가 정의된 범위에서 로컬 변수가 됩니다. 함수가 종료되면 이 변수는 함수에 속하게 되며, var를 사용하지 않고 직접 정의한 변수는 전역 변수가 됩니다. 이해해야 할 또 다른 개념은 범위 체인 문제입니다. 프로그램이 변수를 검색할 때 변수가 없으면 먼저 범위 체인을 따라 위쪽으로 검색합니다. 탐색 후에 발견되면 정의되지 않은 것으로 보고됩니다. 위 코드로 돌아가서 먼저 var를 사용하여 전역 범위에서 x=1을 정의한 다음 foo 함수 내에서 지역 변수 var x=3을 정의합니다. 이 때 x는 2가 됩니다. 이때 로컬 변수가 아닌 전역 변수 x가 수정된다는 점을 기억하세요. x의 값은 내부적으로 검색되어 x=3을 찾은 후 값이 출력됩니다. 따라서 결과는 3입니다. var x=3의 var가 제거되면 x는 전역 변수가 됩니다. x를 수정하는 것은 y 함수에서 x에 값을 할당하는 것과 같습니다. 코드 실행 순서에 따라 전역 변수는 전역 범위에서 검색됩니다. 이때 X는 2이므로 결과는 2
이에는 실제로 ES6 기본 매개변수에 의해 도입된 중간 범위가 포함됩니다. Ruan Yifeng도 처음에 이 문제를 놓쳤지만, 물론 여기서는 맞습니다.
중간 범위의 목적은 기본 매개변수가 함수의 변수에 의해 오염되는 것을 방지하는 것입니다. 기본 매개변수의 원래 의도는 매개변수가 기본값을 갖도록 허용하는 것입니다. 함수 내부의 변수를 늘릴 수 있으면 기본 매개변수는 의미가 없습니다. 구체적인 설명과 예는 기사를 참조하세요.
그러니까 질문을 되돌아보면,
으아악여기에는 외부에서 내부까지 세 개의 범위가 있습니다.
으아악매개변수 x가 없으면 표시는 다음과 같습니다.
으아악y()는 전역 x가 아닌 foo 함수의 매개변수 x를 수정합니다. (여기서 y()를 호출한 후 console.log(x)를 사용하여 전역 x가 여전히 1임을 확인할 수 있습니다.)
문제는 간단합니다. 1) var x = 3을 사용하면 console.log(x in foo )가 인쇄됩니다. foo의 지역 변수 x, y()는 매개 변수 x만 수정하므로 최종 출력은 지역 변수 x = 3
2) var가 사용되지 않으면 foo의 모든 x는 매개 변수 x를 가리키고 y는 사용됨() 매개변수 x를 2로 변경하고 최종적으로 2를 출력합니다
y의 기본값은 전역 변수의 x를 변경합니다.
값이 할당되었습니다.var의 var를 제거합니다. 이때 2
이것은 지역 변수와 전역 변수의 수명주기의 차이점입니다. 메소드의 var x = 3은 지역 변수가 메소드 본문에서 사용되지만 전역 변수입니다. 사용되지 않으므로 출력은 var x = 3; var x = 3;의 var를 제거하면 x의 값입니다. 즉, 전역 변수는 메서드에 정의된 다른 지역 변수가 없음을 의미합니다. 출력은 2입니다.
먼저 var 연산자의 정의를 이해해야 합니다. var 연산자로 정의된 변수는 해당 변수가 정의된 범위에서 로컬 변수가 됩니다. 함수가 종료되면 이 변수는 함수에 속하게 되며, var를 사용하지 않고 직접 정의한 변수는 전역 변수가 됩니다.
입니다.이해해야 할 또 다른 개념은 범위 체인 문제입니다. 프로그램이 변수를 검색할 때 변수가 없으면 먼저 범위 체인을 따라 위쪽으로 검색합니다. 탐색 후에 발견되면 정의되지 않은 것으로 보고됩니다.
위 코드로 돌아가서 먼저 var를 사용하여 전역 범위에서 x=1을 정의한 다음 foo 함수 내에서 지역 변수 var x=3을 정의합니다. 이 때 x는 2가 됩니다. 이때 로컬 변수가 아닌 전역 변수 x가 수정된다는 점을 기억하세요. x의 값은 내부적으로 검색되어 x=3을 찾은 후 값이 출력됩니다. 따라서 결과는 3입니다. var x=3의 var가 제거되면 x는 전역 변수가 됩니다. x를 수정하는 것은 y 함수에서 x에 값을 할당하는 것과 같습니다. 코드 실행 순서에 따라 전역 변수는 전역 범위에서 검색됩니다. 이때 X는 2이므로 결과는 2
으아악