JavaScript - Rest parameters, Spread syntax, Closure, SetTimeout & SetInterval

dev_jubbyΒ·2022λ…„ 10μ›” 8일
0

JavaScript

λͺ©λ‘ 보기
4/6

πŸ“š 볡슡

arr.splice(): νŠΉμ •μš”μ†Œλ₯Ό μ§€μš°κ±°λ‚˜, μ§€μš°λ©΄μ„œ μΆ”κ°€ν•˜κ±°λ‚˜, μ‚­μ œν•˜λŠ” μš”μ†Œλ₯Ό λ°˜ν™˜μ‹œν‚€κΈ°λ„ ν•œλ‹€.
arr.slice(): νŠΉμ •μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. κΈ°μ‘΄ κ°μ²΄μ—λŠ” 영ν–₯μ„λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.
arr.concat(): ν•©μ³μ„œ μƒˆ λ°°μ—΄ λ°˜ν™˜
arr.reduce(fn): λˆ„μ κ³„μ‚°κ°’κ³Ό ν˜„μž¬κ°’μ„ 반볡적으둜 λ°˜ν™˜ν•œλ‹€. 합계 계산할 λ•Œ 유용

ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή
ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή ꡬ문은 λ°°μ—΄μ΄λ‚˜ 객체의 속성을 λΆ„ν•΄ν•΄μ„œ κ·Έ 값을 λ³€μˆ˜μ— 담을 수 있게 ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€.

ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή μ΄ˆκΈ°ν™”
let [a=3, b=4, c=5] = [1]



🧸 λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜ (Rest Parameter)

🎈 인수 전달

function showName(name){
  console.log(name);
}
showName('jubby'); // 'jubby'
showName('jubby', 'ohwa'); // 'jubby'
showName(); // undefined

javascriptμ—μ„œ ν•¨μˆ˜μ— λ„˜κ²¨μ£ΌλŠ” 인수의 κ°œμˆ˜μ—λŠ” μ œμ•½μ΄ μ—†λ‹€. μ—λŸ¬κ°€ λ°œμƒν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

ν•¨μˆ˜μ˜ 인수λ₯Ό μ–»λŠ” λ°©λ²•μ—λŠ” 2가지가 μžˆλ‹€.
1. arguments둜 μ ‘κ·Όν•˜κΈ°.(ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—λŠ” μ—†λ‹€)
2. λ‚˜λ¨Έμ§€ 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš© (ES6 μ΄ν›„λ‘œλŠ” 이걸 더 ꢌμž₯ν•œλ‹€.)


arguments

function showName(name) {
	console.log(arguments.length); // 2
  	console.log(arguments[0]); // jubby
  	console.log(arguments[1]); // ohwa
}
showName('jubby', 'ohwa');
  • ν•¨μˆ˜λ‘œ λ„˜μ–΄ 온 λͺ¨λ“  μΈμˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€.
  • ν•¨μˆ˜ λ‚΄μ—μ„œ 이용 κ°€λŠ₯ν•œ 지역 λ³€μˆ˜
  • length / index
  • Array ν˜•νƒœμ˜ 객체
  • λ°°μ—΄μ˜ λ‚΄μž₯ λ©”μ„œλ“œ μ—†μŒ (forEach, map)

λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜(Rest parameters)

function showName(...names) {
	console.log(names);
}

showName(); // []
showName('jubby'); // ['jubby']
showName('jubby','ohwa'); // ['jubby' ,'ohwa']
  • 정해지지 μ•Šμ€ 개수의 인수λ₯Ό λ°°μ—΄λ‘œ λ‚˜νƒ€λ‚Ό 수 있게 ν•œλ‹€.

μ „λ‹¬ν•˜λŠ” 인자의 κ°œμˆ˜κ°€ λ‹€λ₯Ό λ•Œ

/* 전달 받은 λͺ¨λ“  수λ₯Ό λ”ν•˜λŠ” */
function add(...numbers) {
	let result = 0;
  	numbers.forEach((num) => (result += num));
  	console.log(result);
}

add(1, 2, 3); // 6
add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 55
/* 전달 받은 λͺ¨λ“  수λ₯Ό λ”ν•˜λŠ” */
function add(...numbers) {
	let result = numbers.reduce((prev, cur) => prev + cur);
  	console.log(result);
}

add(1, 2, 3); // 6
add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 55
/* user 객체λ₯Ό λ§Œλ“€μ–΄ μ£ΌλŠ” μƒμ„±μž ν•¨μˆ˜λ₯Ό λ§Œλ“€κ²λ‹ˆλ‹€. */
function User(name, age, ...skills){
	this.name = name;
  	this.age = age;
  	this.skills = skills;
}

const user1 = new User('jubby', 25, 'html', 'css');
const user2 = new User('ohwa', 28, 'React', 'Js');
const user3 = new User('sha', 28, 'English');

console.log(user1); // skills: ['html','css']
console.log(user2); // skills: ['React','Js']
console.log(user3); // skills: 'English'



πŸ“Œ μ „κ°œ ꡬ문 (Spread syntax): λ°°μ—΄

let arr1 = [1,2,3];
let arr2 = [4,5,6];

let result = [...arr1, ...arr2];
console.log(result); // [1,2,3,4,5,6];

let result2 = [0, ...arr1, ...arr2, 7, 8, 9];
console.log(result); // [0,1,2,3,4,5,6,7,8,9];
/* arr1을 [4,5,6,1,2,3] */
let arr1 = [1,2,3];
let arr2 = [4,5,6];

arr2.forEach(num => {
	arr.unshift(num); // [6,5,4,1,2,3] X
});

arr2.reverse().forEach(num => {
	arr.unshift(num); // [4,5,6,1,2,3] O
});

// μ „κ°œκ΅¬λ¬Έ 이용
arr1 = [...arr2, ...arr1]; // 간단해짐

console.log(arr1);
let user = { name: "jubby" };
let info = { age: 30 };
let fe = ["JS", "React"];
let lang = ["Korean", "English"];

// 1. assign, forEach 이용
user = Object.assign({}, user, info, {skills: [], });

fe.forEach(item => {
  user.skills.push(item);
});

lang.forEach(item => {
  user.skills.push(item);
});

// 1.1 μ „κ°œκ΅¬λ¬Έ 이용
user.skill = [...fe, ...lang]; // 간단


// 2. μ „κ°œκ΅¬λ¬Έ 만 이용
user = {
	...user,
  	...info,
    skills: [...fe, ...lang],
};

console.log(user);



πŸ’¬ ν΄λ‘œμ € (Closure)

javascriptλŠ” μ–΄νœ˜μ  ν™˜κ²½(Lexical Environment)을 κ°–λŠ”λ‹€.

// 1. 
// 2.  let one;
// 3. one = 1;

function addOne(num) {
	// 5. console.log(one + num);
}

// 4. addOne(5);

Lexical ν™˜κ²½

  1. one: μ΄ˆκΈ°ν™” X (μ‚¬μš© λΆˆκ°€)
    addOne: function (μ‚¬μš© κ°€λŠ₯)

  2. one: undefined (μ‚¬μš© κ°€λŠ₯)
    addOne: function

  3. one: 1
    addOne: function

그리고 4. μ—μ„œ μ „μ—­ Lexical ν™˜κ²½κ³Ό λ‚΄λΆ€ Lexical ν™˜κ²½μœΌλ‘œ λ‚˜λ‰œλ‹€.

  1. μ „μ—­ Lexical ν™˜κ²½
    one: 1
    addOne: function

  2. λ‚΄λΆ€ Lexical ν™˜κ²½
    num: 5

λ‚΄λΆ€ Lexical ν™˜κ²½μ€ μ™ΈλΆ€(μ „μ—­) Lexical ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κ°™λŠ”λ‹€. μ½”λ“œμ—μ„œ λ³€μˆ˜λ₯Ό 찾을 λ•Œ λ‚΄λΆ€μ—μ„œ μ°Ύκ³  μ—†μœΌλ©΄ μ™ΈλΆ€, 거기에도 μ—†μœΌλ©΄ μ „μ—­ Lexical ν™˜κ²½κΉŒμ§€ λ²”μœ„λ₯Ό λ„“ν˜€μ„œ μ°ΎλŠ”λ‹€.

κ·Έλž˜μ„œ 5. μ—μ„œλŠ” one κ³Ό num을 λ‚΄λΆ€ Lexicalμ—μ„œ μ°ΎλŠ”λ‹€. num은 μžˆμ§€λ§Œ one은 μ—†κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€λ‘œ λ„“ν˜€μ„œ 찾게 λœλ‹€.


// 1. 
function makeAdder(x) {
  // 3. return function(y) {
    // 4.  return x + y;
  }
}
// 2. const add3 = makeAdder(3);
// 4. console.log(add3(2));
  1. μ „μ—­ Lexical ν™˜κ²½
    makeAdder: function
    add3: μ΄ˆκΈ°ν™”X

  2. μ „μ—­ Lexical ν™˜κ²½
    makeAdder: function
    add3: μ΄ˆκΈ°ν™”X
    makeAdder Lexical ν™˜κ²½
    x: 3

  3. μ „μ—­ Lexical ν™˜κ²½
    makeAdder: function
    add3: function
    makeAdder Lexical ν™˜κ²½
    x: 3

  4. μ „μ—­ Lexical ν™˜κ²½
    makeAdder: function
    add3: function
    makeAdder Lexical ν™˜κ²½
    x: 3
    읡λͺ…ν•¨μˆ˜ Lexical ν™˜κ²½
    y: 2

ν΄λ‘œμ €
ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜μ˜ Lexical ν™˜κ²½μ˜ 쑰합이닀.
ν•¨μˆ˜κ°€ 생성될 λ‹Ήμ‹œ μ™ΈλΆ€ λ³€μˆ˜λ₯Ό κΈ°μ–΅ν•˜κ³ , μƒμ„±λœ 이후에도 계속 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
μ™ΈλΆ€ ν•¨μˆ˜μ˜ 싀행이 λλ‚˜μ„œ μ†Œλ©Έλœ 이후에도 λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€.


function makeCounter() {
	let num = 0; // 은닉화
  
  	return function() {
      return num++;
    };
}

let counter = makeCouter();

console.log(couter()); // 0
console.log(couter()); // 1
console.log(couter()); // 2



πŸ•‘ setTimeout / setInterval

⏰ setTimeout

일정 μ‹œκ°„μ΄ μ§€λ‚œ ν›„ ν•¨μˆ˜λ₯Ό μ‹€ν–‰

function fn() {
  console.log(3);
}
setTimeout(fn, 3000);

μœ„μ™€ 같은 μ½”λ“œ

setTimeout(function() {
  console.log(3);
}, 3000);

/* 인수 λ°›κΈ° */
function showName(name) {
  console.log(name);
}

setTimeout(showName, 3000, 'jubby');

clearTimeout
μ˜ˆμ •λœ μž‘μ—…μ„ μ—†μ•€λ‹€. tIdλ₯Ό μ΄μš©ν•΄μ„œ μŠ€μΌ€μ€„λ§μ„ μ·¨μ†Œν•  수 μžˆλ‹€.

/* clearTimeout  */
const tId function showName(name) {
  console.log(name);
}

setTimeout(showName, 3000, 'jubby');
clearTimeout(tId); // 3μ΄ˆκ°€ μ§€λ‚˜κΈ° 전에 μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— 아무일도 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.

⏰ setInterval

일정 μ‹œκ°„ κ°„κ²©μœΌλ‘œ ν•¨μˆ˜λ₯Ό 반볡

function showName(name) {
  console.log(name);
}

const tId = setInterval(showName, 3000, 'jubby'); // 3μ΄ˆλ§ˆλ‹€ jubbyκ°€ 계속 μ°νžŒλ‹€.

clearInterval(tId); // μ€‘λ‹¨ν•˜λ €λ©΄ clearInterval μ‚¬μš©ν•œλ‹€.

μ£Όμ˜μ‚¬ν•­

/* delay = 0? */
setTimeout(function() {
  console.log(2)
}, 0);
console.log(1);       

μ‹€ν–‰κ²°κ³Ό

1
2

예제

let num = 0;

function showTime() {
	console.log(`μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ ${num++}μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.`);
  
  	if(num > 5) {
  		clearInterval(tId);
    }
}

const tId = setInterval(showTime, 1000);

μ‹€ν–‰κ²°κ³Ό

μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ 0μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ 1μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ 2μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ 3μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ 4μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ•ˆλ…•ν•˜μ„Έμš”. μ ‘μ†ν•˜μ‹ μ§€ 5μ΄ˆκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
profile
μ‹ μž… 개발자 μ₯¬λΉ„μ˜ 기술 λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€