이 코드는 Ruan Yifeng 선생님이 쓴 es6 책에 나와 있습니다. 텍스트 설명에 y의 x와 var x = 3이 다르다고 나와 있습니다. 여기.
그런 다음 var x= 3의 var를 제거하면 2가 출력될 수 있는데 이는 더욱 이해하기 어렵습니다. . . 답변이 있기를 바랍니다
女神的闺蜜爱上我2017-07-05 10:39:59
이에는 실제로 ES6 기본 매개변수에 의해 도입된 중간 범위가 포함됩니다. Ruan Yifeng도 처음에 이 문제를 놓쳤지만, 물론 여기서는 맞습니다.
중간 범위의 목적은 기본 매개변수가 함수의 변수에 의해 오염되는 것을 방지하는 것입니다. 기본 매개변수의 원래 의도는 매개변수가 기본값을 갖도록 허용하는 것입니다. 함수 내부의 변수를 늘릴 수 있으면 기본 매개변수는 의미가 없습니다. 구체적인 설명과 예는 기사를 참조하세요.
그러니까 질문을 되돌아보면,
으아악여기에는 외부에서 내부까지 세 개의 범위가 있습니다.
으아악매개변수 x가 없으면 표시는 다음과 같습니다.
으아악阿神2017-07-05 10:39:59
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를 출력합니다
天蓬老师2017-07-05 10:39:59
이것은 지역 변수와 전역 변수의 수명주기의 차이점입니다. 메소드의 var x = 3은 지역 변수가 메소드 본문에서 사용되지만 전역 변수입니다. 사용되지 않으므로 출력은 var x = 3; var x = 3;의 var를 제거하면 x의 값입니다. 즉, 전역 변수는 메서드에 정의된 다른 지역 변수가 없음을 의미합니다. 출력은 2입니다.
扔个三星炸死你2017-07-05 10:39:59
먼저 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