방금 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
은 전역 변수가 아닌 로컬 범위에서만 발생합니다.
답변
- 함수 선언
function a(){}
이 먼저 호이스트되고처럼 동작var a = function () {};
하므로 로컬 범위a
에서 생성됩니다. - 같은 이름의 변수가 두 개있는 경우 (하나는 전역에서 다른 하나는 로컬에서) 지역 변수는 항상 전역 변수보다 우선합니다.
- 을 설정 하면 전역
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
var a
전역 범위에서 어휘 적으로 정의되고 선언되었습니다.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
이 값 을 얻고 1
a 내부 function b
가 10
. 할 때 alert(a)
실제 전역 범위 변수를 호출합니다. 코드를 조금만 변경하면 더 명확 해집니다.
var a = 1;
function b() {
a = 10;
return a;
function a() { }
}
alert(b());
alert(a);