자바 스크립트 '게양'[중복]
이 질문에 이미 답변이 있습니다.
- 자바 스크립트 함수 범위 지정 및 호이 스팅 16 답변
나는 자바 스크립트 '게양'을 발견했고이 코드 조각이 실제로 어떻게 작동하는지 알아 내지 못했습니다.
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
( function a() {}
) 와 같은 함수 선언 이 함수 b
범위 의 맨 위에 올릴 것이지만 a
(함수 선언이 변수 선언을 재정의하지만 변수 초기화가 아닌) 값을 재정의해서는 안된다는 것을 알고 있으므로 경고의 값이 1 대신 10이 되십시오 !!
- 글로벌
a
은1
b()
불린다function a() {}
게양되고 전역을 마스킹 하는 지역 변수a
를 생성합니다.a
- 로컬이
a
설정된다10
(덮어 쓰기 기능a
) - 글로벌
a
(여전히1
) 경고
이 예제의 컴파일 / 해석 순서가 다소 오해를 불러 일으키기 때문입니다. 이 function a () {}
행은 나머지 함수가 실행되기 전에 해석되므로 함수의 맨 처음에 a
값이 function a () {}
. 당신이 그것을 다시 할당 할 때 10
, 당신의 가치를 재 할당하는 a
함수의 로컬 범위에서 b()
의 원래 값은 그대로두고 반환하면 다음 폐기, a = 1
글로벌 범위를.
다양한 지점에서 alert()
의 값이 무엇인지 확인하기 위해 적절한 위치에 s 등 을 배치하여이를 확인할 수 있습니다 a
.
(1) JavaScript에는 블록 문 범위가 없습니다. 오히려 블록이 상주하는 코드에 국한됩니다.
(2) 함수 범위에서 자바 스크립트의 변수 선언. 즉, 함수에서 선언 된 변수는 값이 할당되기 전에도 해당 함수의 모든 위치에서 사용할 수 있습니다 .
(3) 함수 본문 내에서 지역 변수는 같은 이름의 전역 변수보다 우선합니다. 전역 변수와 이름이 같은 지역 변수 또는 함수 매개 변수를 선언하면 전역 변수를 효과적으로 숨길 수 있습니다.
코드는 다음과 같습니다 : ( 주석 읽기 )
<script>
var a = 1; //global a = 1
function b() {
a = 10;
var a = 20; //local a = 20
}
b();
alert(a); //global a = 1
</script>
reference:
(1) JavaScript Variable Scope:
(2) A Dangerous Example of Javascript Hoisting
(3) Variable scope
So in your code:
var a = 1; //global a = 1
function b() {
a = 10;
return;
function a() {} //local
}
b();
alert(a); //global a = 1
- function declaration
function a(){}
is hoisted first, hence in local scopea
is created. - If you have two variable with same name (one in global another in local), local variable always get precedence over global variable.
- When you set
a=10
, you are setting the local variablea
, not the global one.
Hence, the value of global variable remain same and you get, alerted 1
When I read the same article you did JavaScript Scoping and Hoisting, I was confused as well because the author never showed what the two opening example codes are interpreted as in the compiler.
Here is example you provided, and the second on the page:
var a = 1;
function b() {
function a() {} // declares 'a' as a function, which is always local
a = 10;
return;
}
b();
alert(a);
and here is the first example on the page:
var foo = 1;
function bar() {
var foo; // a new local 'foo' variable
if (!foo) {
foo = 10;
}
alert(foo);
}
bar();
Hope this helps
참고URL : https://stackoverflow.com/questions/15311158/javascript-hoisting
'program story' 카테고리의 다른 글
HashMap Java 8 구현 (0) | 2020.09.23 |
---|---|
Twitter Bootstrap 드롭 다운을위한 이벤트 핸들러? (0) | 2020.09.22 |
Angular-seed는 사실상 빈 프로젝트로 시작할까요? (0) | 2020.09.22 |
Firefox의 IPython Notebook에서 실행중인 셀을 끊는 CTRL + C와 동일한 기능이 있습니까? (0) | 2020.09.22 |
이름이 같은 네임 스페이스와 클래스? (0) | 2020.09.22 |