var x = 'global';
function func1(){
var x = 'local';
func2();
}
function func2(){
console.log(x);
}
func1(); //결과값 : global
func2(); //결과값 : global
function count() {
var i;
for (i = 1; i < 10; i += 1) {
setTimeout(function timer() {
console.log(i);
}, i*100);
}
}
count(); //결과값 : 10이 9번 출력됨
/**
1) timer는 클로저로 항상 상위 스코프인 count에게 i 를 알려달라고 요청함
2) timer는 그러고 0.1초 후 호출됨
3) 첫 0.1초가 지날 동안 이미 i는 10이 됨
4) timer는 0.1초 주기로 호출할 때마다 count에서 i를 요청함
=> timer는 이미 10이 되어비린 i만 출력
**/
의도대로 1~9까지 차례대로 출력하는 방법
1) 새로운 스코프를 추가하여 반복 시마다 그 곳에 각각 따로 값을 저장하는 방식
function count() {
var i;
for (i = 1; i < 10; i += 1) {
(function(countingNumber) {
setTimeout(function timer() {
console.log(countingNumber);
}, i * 100);
})(i);
}
}
count();
2) ES6에서 추가된 블록 스코프 이용하는 방식
```
function count() {
'use strict';
for (let i = 1; i < 10; i += 1) {
setTimeout(function timer() {
console.log(i);
}, i * 100);
}
}
count();
function foo() {
a=2;
var a=2;
console.log(a); //결과값 : 2 (선언부가 호이스팅 됨)
}
function foo(){
console.log(a);
var a=2; //결과값 : undefined (선언 전 참조됨)
}
/**
블록 스코프인 ES6의 let도 호이스팅 되지만, 선언 전에 참조할 경우 undefied를 반환하지 않고 ReferenceError를 발생시킴
**/
.
.
.
.
참조
https://yunzema.tistory.com/362
https://meetup.toast.com/posts/86
https://m.blog.naver.com/jaemin-jeong/221877574892