program story

자바 스크립트 '게양'

inputbox 2020. 9. 22. 08:11
반응형

자바 스크립트 '게양'[중복]


이 질문에 이미 답변이 있습니다.

나는 자바 스크립트 '게양'을 발견했고이 코드 조각이 실제로 어떻게 작동하는지 알아 내지 못했습니다.

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}

b();
alert(a);

( function a() {}) 와 같은 함수 선언 이 함수 b범위 의 맨 위에 올릴 것이지만 a(함수 선언이 변수 선언을 재정의하지만 변수 초기화가 아닌) 값을 재정의해서는 안된다는 것을 알고 있으므로 경고의 값이 1 대신 10이 되십시오 !!


  1. 글로벌 a1
  2. b() 불린다
  3. function a() {}게양되고 전역을 마스킹 하는 지역 변수 a생성합니다.a
  4. 로컬이 a설정된다 10(덮어 쓰기 기능 a)
  5. 글로벌 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  

  1. function declaration function a(){} is hoisted first, hence in local scope a is created.
  2. If you have two variable with same name (one in global another in local), local variable always get precedence over global variable.
  3. When you set a=10, you are setting the local variable a , 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

반응형