[javascript] 자바 스크립트 함수 범위 지정 및 호이 스팅

방금 Ben Cherry의 JavaScript Scoping and Hoisting에 대한 훌륭한 기사를 읽었습니다 .

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}
b();
alert(a);

위의 코드를 사용하면 브라우저는 “1”을 경고합니다.

왜 “1”을 반환하는지 잘 모르겠습니다. 그가 말한 것 중 일부는 다음과 같이 떠 오릅니다. 모든 함수 선언이 맨 위로 올라갑니다. 함수를 사용하여 변수의 범위를 지정할 수 있습니다. 여전히 나를 위해 클릭하지 않습니다.



답변

기능 호이 스팅은 기능이 범위의 맨 위로 이동하는 것을 의미합니다. 그건,

function b() {
   a = 10;
   return;
   function a() {}
}

interpeter에 의해 이것으로 다시 쓰여질 것입니다

function b() {
  function a() {}
  a = 10;
  return;
}

이상 해요?

또한이 경우

function a() {}

똑같이 행동했다

var a = function () {};

따라서 본질적으로 코드가 수행하는 작업은 다음과 같습니다.

var a = 1;                 //defines "a" in global scope
function b() {
   var a = function () {}; //defines "a" in local scope 
   a = 10;                 //overwrites local variable "a"
   return;
}
b();
alert(a);                 //alerts global variable "a"


답변

기억해야 할 것은 전체 함수를 구문 분석하고 실행하기 전에 모든 변수 선언을 해결한다는 것입니다. 그래서….

function a() {}

정말된다

var a = function () {}

var a 로컬 범위로 강제하고 변수 범위는 전체 함수를 통하므로 전역 변수는 여전히 1입니다.을 함수로 만들어서 로컬 범위로 선언했기 때문입니다.


답변

기능 a은 기능 내부에 게양됩니다 b.

var a = 1;
function b() {
   function a() {}
   a = 10;
   return;
}
b();
alert(a);

거의 다음을 사용하는 것과 같습니다 var.

var a = 1;
function b() {
   var a = function () {};
   a = 10;
   return;
}
b();
alert(a);

함수는 로컬로 선언되며 설정 a은 전역 변수가 아닌 로컬 범위에서만 발생합니다.


답변

  1. 함수 선언 function a(){}이 먼저 호이스트되고처럼 동작 var a = function () {};하므로 로컬 범위 a에서 생성됩니다.
  2. 같은 이름의 변수가 두 개있는 경우 (하나는 전역에서 다른 하나는 로컬에서) 지역 변수는 항상 전역 변수보다 우선합니다.
  3. 을 설정 하면 전역 a=10변수 a가 아닌 로컬 변수가 설정 됩니다.

따라서 전역 변수의 값은 동일하게 유지되고 경고 1이 표시됩니다.


답변

function a() { }함수에 a로컬 변수 를 생성하는 함수 문 b입니다. 또는 function 문이 실행
되는지 여부에 관계없이 함수가 구문 분석 될 때 변수가 생성됩니다 var.

a = 10 이 지역 변수를 설정합니다.


답변

이 작은 코드 조각에서 경합의 뼈대는 무엇입니까?

사례 1 :

다음과 같이 function a(){}본문에 정의를 포함 function b합니다.logs value of a = 1

var a = 1;
function b() {
  a = 10;
  return;

  function a() {}
}
b();
console.log(a); // logs a = 1

사례 2

다음과 같이 function a(){}본문 내부의 정의를 제외 function b합니다.logs value of a = 10

var a = 1;
function b() {
  a = 10;  // overwrites the value of global 'var a'
  return;
}
b();
console.log(a); // logs a = 10

관찰은 명령문 console.log(a)이 다음 값을 기록 한다는 사실을 깨닫는 데 도움이 됩니다.

사례 1 : a = 1

사례 2 : a = 10

Posits

  1. var a 전역 범위에서 어휘 적으로 정의되고 선언되었습니다.
  2. a=10 이 문은 값을 10으로 재 할당하고 있으며 어휘 적으로 함수 b 내에 있습니다.

두 경우에 대한 설명

로 인해 function definition with name property(A)가 동일하다 variable a. variable a내부는 function body b로컬 변수가된다. 이전 행은 a의 전역 값이 그대로 유지되고 a의 로컬 값이 10으로 업데이트됨을 의미합니다.

그래서 우리가 말하고자하는 것은 아래 코드가

var a = 1;
function b() {
  a = 10;
  return;

  function a() {}
}
b();
console.log(a); // logs a = 1

JS 인터프리터는 다음과 같이 해석합니다.

var a = 1;
function b() {
  function a() {}
  a = 10;
  return;


}
b();
console.log(a); // logs a = 1

그러나 함수 b 외부 function a(){} definition에서 value of 'a'선언되고 정의 된 ,를 제거하면 해당 값을 덮어 쓰고 경우 2에서 10으로 변경합니다. 값은 a=10전역 선언을 참조하기 때문에 덮어 쓰여지고 로컬로 선언 될 경우 서면 var a = 10;.

var a = 1;
function b() {
  var a = 10; // here var a is declared and defined locally because it uses a var keyword. 
  return;
}
b();
console.log(a); // logs a = 1

우리는 변화에 의해 우리의 의심을 더욱 명확히 할 수 name property있는을 function a(){} definition다른 이름보다'a'

var a = 1;
function b() {
  a = 10; // here var a is declared and defined locally because it uses a var keyword. 
  return;

  function foo() {}
}
b();
console.log(a); // logs a = 1


답변

호이 스팅은 이해하기 쉽도록 만든 개념입니다. 실제로 발생하는 것은 범위와 관련하여 선언이 먼저 수행되고 그 이후에 할당이 발생합니다 (동시에 아님).

선언이 발생하는 경우 var a, 다음 function b그 안에 b범위 function a선언된다.

이 함수 a는 전역 범위에서 오는 변수 a를 숨 깁니다.

선언이 완료되면 값 할당이 시작되고 전역 a이 값 을 얻고 1a 내부 function b10. 할 때 alert(a)실제 전역 범위 변수를 호출합니다. 코드를 조금만 변경하면 더 명확 해집니다.

        var a = 1;

    function b() {
        a = 10;
        return a;

        function a() { }
    }

    alert(b());
    alert(a);