1) 자바스크립트 코드 실행 단계에서 발생하는 일
생성 단계 - 실행 컨텍스트 생성
실행 단계 - 변수 값 할당, 코드 실행
2)
console.log(callMe());
(?) x = 10;
console.log(callMe())
function callMe() {
return x;
}
(?)에 let을 넣으면 에러가 발생한다.
실행 컨텍스트 생성 단계에서 자바스크립트 엔진은 변수 선언을 읽어 변수를 실행 컨텍스트에 저장한다.
실행 컨텍스트 실행 단계에서 자바스크립트 엔진은 변수 할당 구문을 읽어 실행 컨텍스트에 저장된 변수에 값을 저장한다.
함수 선언문은 생성 단계에서 함수명과 함수 전체가 저장된다.
실행 컨텍스트 실행 단계에서 자바스크립트 엔진이 변수명을 읽으면 렉시컬 환경에서 값을 읽는다.
console.log(callMe())
// undefined
var x = 10
console.log(callMe()) // 10
function callMe() {
return x
}
// ReferenceError: Cannot access 'a'
// before initialization
console.log(callMe())
// undefined
let x = 10
console.log(callMe()) // 10
function callMe() {
return x
}
function varFor(){
for (var i = 0; i < 3; ++i) {
setTimeout(() => console.log('i: ', i), 0);
}
}
function letFor(){
for (let i = 0; i < 3; ++i) {
setTimeout(() => console.log('i: ', i), 0);
}
}
varFor(); // 3 3 3
letFor(); // 0 1 2
varFor에서 3 3 3 이 나온 이유는, 비동기방식으로 실행되어 setTimeout이 지연되는동안 for문이 다돌아서 그런거다
참고: https://velog.io/@yonyas/Javascript-for%EB%AC%B8%EA%B3%BC-setTimeout-%EB%8F%99%EC%8B%9C%EC%97%90-%EC%93%B8-%EB%95%8C-var%EC%99%80-let%EC%9D%98-%EC%B0%A8%EC%9D%B4
function changeToUsd(krw) {
const rate = 1046;
return (krw / rate).toFixed(2);
}
const krw = 1000000;
console.log(changeToUsd(krw));
function formatNumber(n) {
if (isNaN(n)) return '0';
return Number(n).toFixed(2);
}
formatNumber('12.345') // 12.35
function getMaxDiff(nums) {
return Math.max(...nums)-Math.min(...nums)
}
getMaxDiff([-1, -4, -7, 11]) // 18
Math.random()은 0에서 1사이의 float number를 구한다.
Math.floor는 소수점 이하 숫자를 버린다.
function isWeekend(today) {
let day = today.getDay();
return day === 0 || day === 6;
}
console.log(isWeekend(new Date('2021/9/12')));
function addDays(date, days) {
date.setDate(date.getDate() + days)
return date.toDateString()
}
addDays(new Date('2021/9/22'), 100) // Fri Dec 31 2021
function timeDiff(date1, date2) {
return date2.getTime() = date1.getTime();
}
let dayTime = 60 * 24 * 60 * 1000
function fromNow(date) {
let diff = timeDiff(date, new Date())
return `${Math.floor(diff/dayTime)} days ago...`
}
fromNow(new Date('2021/9/1'))
문자열로 된 시간을 Date 객체로 변환하면 Date 객체가 생성된다.
let year = date.getFullYear();
let month = date.getMonth()+1; //(1월은 0, 2월은 1, ...)
let day = date.getDate();
let hour = date.getHours();
let min = date.getMinutes();
let sec = date.getSeconds();
JSON.stringify({name: "Daniel", age:12})
// '{"name":"Daniel", "age":12}'
JSON.parse('{"name":"Daniel", "age":12}')
// {name: "Daniel", age:12}
.reduce((map, char) => {
if (!map[char]) map[char] = 0
map[char]++
return map
Object.entries(this.object)
.reduce((acc, [key, value]) => `${acc} [${key}: ${value}]`,"")
.trim()
const {a, b, c, d} = {
a: 1,
b: 2,
c: 3,
d: 4
}
function parse(value) {
return {
1: "연별",
2: "반기별",
4: "분기별",
12: "월별",
}[value];
}
// stocks 데이터를 이용해, tbody 안에 들어갈 태그를 동적으로 만드세요.
const tableData = stocks.map( // stocks는 [{x:a, y:b}, {z:1, o:2}] 와 같은 형태
({stockName, buyPrice, currentPrice, stockAmount}) => ({
name: stockName,
earningRate: ((currentPrice - buyPrice)/buyPrice * 100).toFixed(2),
profit: (currentPrice - buyPrice) * stockAmount
})
)
const [buyPriceSum, currentPriceSum] = [
stocks.reduce((acc, cur) => acc+cur.buyPrice * cur.stockAmount, 0),
stocks.reduce((acc, cur) => acc+cur.currentPrice * cur.stockAmount, 0)
]
up() {
this.step += 1;
return this;
}
return templates[id].replace(/{name}|{n}/g, function (val) {
return val === "{name}" ? names.shift() : names.length;
});
}