하다보니 var가 얼마나 거지같은지 알 수 있었다.
let과 const를 사랑하자..
console.log(x) // undefined
var x = 1
// var x 선언문
// x =1 할당문
console.log(x) // 초기값에러 - Uncaught Reference Error
let y = 1
let a = 10
console.log(a)
let a = 20 // Identifier 'a' has already been declared 에러 - 변수 선언이 script 맨 먼저 일어나서 아예 위에 console(a) 도 실행안됨.
console.log(a)
const a = 10
console.log(a) // 10
a = 20 // Assignment to constant variable 에러
console.log(a)
let x = 0
{
let x = 1
console.log(x) //1
}
console.log(x) //0
var x = 0
{
var x = 1
console.log(x) //1
}
console.log(x) //1
var a = 10 // 전역변수
(function () { // 즉시 실행함수 - 함수를 정의하면서 바로 실행함
var b = 20 // 지역변수
})()
console.log(a) // 10
console.log(b) // 에러
var x =1
function foo(){
var x = 10
bar()
}
function bar(){
console.log(x)
}
foo() // 1
// var x = 10 이 되나 foo 함수가 범위에서 벗어나서 종료됨
// bar 에서는 x 선언이 없기 때문에 전역변수 var x =1 을 찾아 console.log 출력
bar() // 1
// bar 에서는 x 선언이 없기 때문에 전역변수 var x =1 을 찾아 console.log 출력
var funcs = [];
// 함수의 배열을 생성하는 for 루프의 i는 전역 변수다.
for (var i = 0; i < 3; i++) {
funcs.push(function () { console.log(i); });
}
// 배열에서 함수를 꺼내어 호출한다.
for (var j = 0; j < 3; j++) {
funcs[j](); // 3 - 3번 출력됨
}
// 클로저 사용으로 해결
var funcs = [];
// 함수의 배열을 생성하는 for 루프의 i는 전역 변수다.
for (var i = 0; i < 3; i++) {
(function (index) { // index는 자유변수다.
funcs.push(function () { console.log(index); });
}(i));
}
// 배열에서 함수를 꺼내어 호출한다
for (var j = 0; j < 3; j++) {
funcs[j](); // 1,2,3
}
// 위와 동일 코드를 let으로 바꿨을 때
var funcs = [];
// 함수의 배열을 생성하는 for 루프의 i는 for 루프의 코드 블록에서만 유효한 지역 변수이면서 자유 변수이다.
for (let i = 0; i < 3; i++) {
funcs.push(function () { console.log(i); });
}
// 배열에서 함수를 꺼내어 호출한다.
for (var j = 0; j < 3; j++) {
funcs[j](); // 1,2,3
}
console.log(typeof +'10') // number (문자열 -> 숫자 : 암묵적 형변환)
console.log('10'+ 1) // 101
console.log(typeof 10 + '') // String (숫자 -> 문자 : 암묵적 형변환)
// +'문자열' 응용
console.log(+'10' + 1) // 11