Javascript에서 언제 그리고 어디서 호이 스팅을 사용해야합니까?


11

Javascript를 처음 사용합니다. Javascript에서 호이 스팅 개념을 배우고 있습니다. Mozilla 웹 사이트
의 Javacsript 튜토리얼을 바탕 으로이 단어를 발견했습니다 . 이 튜토리얼에 따르면 JavaScript의 변수는 예외없이 나중에 선언 된 변수를 참조 할 수 있다는 것 입니다. 그러나 내 질문은 클라이언트 측 Javascript에서 호이 스팅을 사용하는 것이 어떤 상황에 적합한 지 또는 Javascript에서 호이 스팅을 사용해야하는 이유에 관한 것입니다. 장점은 무엇입니까?hoisting


1
연구 결과를 공유하면 모든 사람에게 도움이됩니다. 당신이 무엇을 시도했고 왜 그것이 당신의 요구를 충족시키지 못했는지 알려주십시오. 이것은 당신이 시간을내어 자신을 돕기 위해 노력했고, 명백한 답변을 반복하지 못하게하며, 무엇보다도보다 구체적이고 관련성있는 답변을 얻는 데 도움이됩니다. 또한 요청하는 방법
gnat

6
@gnat 모든 연구를 마친 후에이 주제를 이해했다면 개념을 올바르게 논의하고 이해하기 위해 왜이 질문을 여기에 게시했을까요
Rudra

2
@Rudra 토론 포럼 이 아닙니다 . 또한 실제로 연구했다는 증거 를 보여 주지 않았습니다 .
Doval

5
예,하지만 질문을 할 필요는 없습니다.
Robert Harvey

2
@Rudra : 우리는 토론 포럼 이 아닙니다 . 우리는 실제로 Q & A 사이트입니다. 여기에서 묻는 질문은 Q & A 형식 내에서 합리적으로 대답 할 수있는 범위를 지정해야합니다.
Robert Harvey

답변:


11

나는 "게양"이라는 용어를 사용한 적이 없다. Ben Cherry의 http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html 에서의이 호이 스팅 사용법을 언급하고 있다면 , 내가 수집 할 수있는 것에서 그는 단순히 Javascript 에서 Douglas Crockford를 반향합니다 . 좋은 부품 , 당신이해야한다는 말을 결코 게양을 사용하지 . 그의 주장은 Crockford와 JSLint가 제안한 것처럼 모든 변수가 함수의 맨 위에 선언되어야한다는 것입니다.

또는 ChristopherBrown의 말에 따르면, 이 기능은 사용 하는 기능이 아니라 브라우저가 Javascript를 해석하는 방식과 관련이 있습니다.

간단히 말해서 : never and nowhere .


1
그러면이 개념이 포함 된 이유와이 기능은 무엇입니까?
Rudra

@Rudra : David 링크 된 기사의 "선언, 이름 및 게양"하위 주제는이 내용을 잘 다루는 것 같습니다. 어느 부분이 불분명합니까?
Robert Harvey

@RobertHarvey 나는 이것을 언제 어디서 사용하는지 알고 싶습니다. David는이 도구가 결코 어디에도 사용되지 않는다고 말하지만 왜 기능으로 표시되는지
Rudra

4
기능이 있다고해서 좋은 생각이 아닙니다. "기능"이 유리하지 않은 데는 여러 가지 이유가 있습니다. 비록 동굴 사람 시대에 그랬을지라도 당신의 부록조차도 분명히 유용한 목적을 제공하지는 않습니다.
Robert Harvey

1
호이 스팅은 컴파일러 이론, 특히 최적화의 용어입니다. 적어도 20 년 동안 사용되었지만이 독특한 자바 스크립트로 인기를 얻었습니다. 기능이라고 부르지 않았다면 아마도 버그 일 것입니다.
david.pfx

16

호이 스팅은 브라우저가 Javascript를 해석하는 방법에 대한 기능을 설명하며 그렇게 많이 사용되지는 않습니다.

Javascript를 해석 할 때 브라우저는 함수 시작시 함수 레벨 변수의 범위를 지정합니다. 예:

function AddTwoAndTwo() {
    var two = 2;
    var result = two + two;
    return result;
}

게시 된 코드에서 "two"및 "result"변수는 함수 범위의 시작 부분에 존재합니다 (확실히 선언 된대로). 그러나 브라우저가 변수를 "게양"하기 때문에 다음은 올바른 Javascript 코드가됩니다. .

function AddTwoAndTwo() {
    result = 5;
    alert(result);
    var two = 2;
    var result = two + two;
    return result;
}

여기서 효과는 선언하기 전에 사용중인 변수가 있으며 특히 전역 범위 변수와 혼동 될 수 있습니다. 예:

var result = 6;

function AddTwoAndTwo() {
    alert(result);  // should this be 6 or undefined?
    var two = 2;
    var result = two + two;
    return result;
}

혼동을 피하려면 함수 맨 위에 변수를 선언하십시오.


4
+1 : 이것이 내가 대답하는 방법입니다. 사용하거나 사용하지 않는 기능이 아니라 환경의 속성 일뿐입니다.
scrwtp

1

왜?

JavaScript에는 Block Scope 가 없으므로 왜 물건을 맨 위로 올리는지 설명해야합니다 .

유용합니까?

당신이 이것을 선호한다면 :

var someVariable = someVariable || {};

이 대신에 :

if ( "undefined" !== typeof someVariable ) {
    someVariable = someVariable;
} else {
    someVariable = {};
}

그러면 유용합니다. 눈치 채지 않아도!

정리

첫 번째 예는 다음과 같이 번역됩니다.

var someVariable = someVariableValue;

if ( "undefined" !== typeof someVariable ) {
    var someVariableValue = someVariable;
} else {
    var someVariableValue = {};
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.