var은 함수 전체에서 참조 가능.
function discountPrices (prices, discount) {
var discounted = []
for (var i = 0; i < prices.length; i++) {
var discountedPrice = prices[i] * (1 - discount)
var finalPrice = Math.round(discountedPrice * 100) / 100
discounted.push(finalPrice)
}
console.log(i) // 3
console.log(discountedPrice) // 150
console.log(finalPrice) // 150
return discounted
}
for loop안에서 정의된 변수값을 밖에서 참조 가능. 함수 scope이기 때문이다.
.
function discountPrices (prices, discount) {
console.log(discounted) // undefined
var discounted = []
for (var i = 0; i < prices.length; i++) {
var discountedPrice = prices[i] * (1 - discount)
var finalPrice = Math.round(discountedPrice * 100) / 100
discounted.push(finalPrice)
}
console.log(i) // 3
console.log(discountedPrice) // 150
console.log(finalPrice) // 150
return discounted
}
var의 경우 정의하기 전에 참조 시도하면 undefined값을 기본을 가짐. 이는 interpreter가 뒤에서 하는 작업으로 다른 언어를 생각하면 이해하기 힘들지만 그렇다. 이렇게 미리 기본값을 넣어 놓는 것을 hoisting이라고 한다.
.
.
.
let 블락 scope
function discountPrices (prices, discount) {
let discounted = []
for (let i = 0; i < prices.length; i++) {
let discountedPrice = prices[i] * (1 - discount)
let finalPrice = Math.round(discountedPrice * 100) / 100
discounted.push(finalPrice)
}
console.log(i) console.log(discountedPrice) console.log(finalPrice)
return discounted
}
for loop안의 변수 밖에서 참조 못함.
.
function discountPrices (prices, discount) {
console.log(discounted) // ❌ ReferenceError
let discounted = []
for (let i = 0; i < prices.length; i++) {
let discountedPrice = prices[i] * (1 - discount)
let finalPrice = Math.round(discountedPrice * 100) / 100
discounted.push(finalPrice)
}
console.log(i) // 3
console.log(discountedPrice) // 150
console.log(finalPrice) // 150
return discounted
}
let 은 hoisting작업을 안하게 한다.
.
.
const는 let가 비슷하나 reasign이 되지 않는다.
let name = 'Tyler'
const handle = 'tylermcginnis'
name = 'Tyler McGinnis' // ✅
handle = '@tylermcginnis' // ❌ TypeError: Assignment to constant variable.