Skip to content

Functions (ํ•จ์ˆ˜) โ€‹

๐Ÿงฉ Notes

ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ์˜ ํ•ต์‹ฌ ๋‹จ์œ„๋‹ค.
Airbnb ๊ฐ€์ด๋“œ๋Š” ๋ช…ํ™•ํ•œ ์„ ์–ธ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘, ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ํ†ตํ•ด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค.

1. ํ•จ์ˆ˜ ์„ ์–ธ์‹ ๋Œ€์‹  ๊ธฐ๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์‚ฌ์šฉ โ€‹

eslint: func-style

js
// bad
function foo() {
  // ...
}

// bad
// ์ต๋ช… ํ•จ์ˆ˜๋Š” ์Šคํƒ ์ถ”์ ์ด ์–ด๋ ต๋‹ค.
const foo = function () {
  // ...
};

// good
// ๋ณ€์ˆ˜๋ช…๊ณผ ๊ตฌ๋ถ„๋˜๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„(lexical name)์„ ์ง€์ •
const short = function longUniqueMoreDescriptiveLexicalFoo() {
  // ...
};
  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ์ •์˜ ์ „์—๋„ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ ํ๋ฆ„์ด ๋ถˆ๋ช…ํ™•ํ•ด์ง„๋‹ค.
  • ํ•จ์ˆ˜๊ฐ€ ํฌ๊ฑฐ๋‚˜ ๋ณต์žกํ•˜๋‹ค๋ฉด ๋ณ„๋„ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—๋Š” ๋ช…์‹œ์  ์ด๋ฆ„์„ ๋ถ™์ด๋ฉด ๋””๋ฒ„๊น… ์‹œ ํ˜ธ์ถœ ์Šคํƒ ์ถ”์ ์ด ์šฉ์ดํ•˜๋‹ค.

2. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(IIFE)๋Š” ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ๊ธฐ โ€‹

eslint: wrap-iife

js
// ์ฆ‰์‹œ ํ˜ธ์ถœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ (IIFE)
(function () {
  console.log('Welcome to the Internet. Please follow me.');
})();
  • IIFE๋Š” ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹ ๋‹จ์œ„์ด๋ฏ€๋กœ, ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‹จ, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์„ ์“ฐ๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” IIFE ์ž์ฒด๊ฐ€ ๋ถˆํ•„์š”ํ•˜๋‹ค.
๐Ÿ’ก ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ (IIFE, Immediately Invoked Function Expression)

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ์ •์˜๋˜์ž๋งˆ์ž ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋‹ค. ํ•จ์ˆ˜๋ฅผ ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์„œ ํ‘œํ˜„์‹์œผ๋กœ ๋งŒ๋“ค๊ณ , ๋งˆ์ง€๋ง‰์— ()๋กœ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค.

์™œ ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์•ผ ํ• ๊นŒ?
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” function foo() {}๋ฅผ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์„ ์–ธ์ด ์•„๋‹ˆ๋ผ ํ‘œํ˜„์‹์œผ๋กœ์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์—, ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์„œ "์ด๊ฑด ํ‘œํ˜„์‹์ด์•ผ"๋ผ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

js
// ์„ ์–ธ๋ฌธ (ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ)
function hello() {
  console.log('hello');
}

// ํ‘œํ˜„์‹์œผ๋กœ ๋งŒ๋“  ๋’ค ์ฆ‰์‹œ ์‹คํ–‰
(function () {
  console.log('hello');
})();

ํ˜„๋Œ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ES6+)์—์„œ๋Š” let, const, import/export๋กœ ์Šค์ฝ”ํ”„๊ฐ€ ๋ช…ํ™•ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— IIFE๋ฅผ ์ง์ ‘ ์“ธ ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค.
Airbnb ๊ฐ€์ด๋“œ์—์„œ โ€œ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์“ฐ๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๋‹คโ€๋Š” ๋ง์ด ๋ฐ”๋กœ ์ด ๋œป์ด๋‹ค!


3. ํ•จ์ˆ˜๋Š” ๋ธ”๋ก (if / while ๋“ฑ) ์•ˆ์—์„œ ์„ ์–ธํ•˜์ง€ ๋ง ๊ฒƒ โ€‹

eslint: no-loop-func

js
// bad
// if ๋ธ”๋ก ์•ˆ์—์„œ ์„ ์–ธ๋˜์—ˆ๋Š”๋ฐ,
if (isUser) {
  function test() {}
}

test(); // ๋ฐ–์—์„œ๋„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ โ†’ ๋ฌธ์ œ!

// good
let test;

if (isUser) {
  test = () => {};
}

test(); // ์ž‘๋™
  • ํ•จ์ˆ˜ ์„ ์–ธ์€ ๋ธ”๋ก ๋ฒ”์œ„๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜/์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค.
  • ๋ธ”๋ก ๋‚ด๋ถ€ ์„ ์–ธ์€ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

4. ECMA-262: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ โ€‹

ECMA-262 ๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด, ๋ธ”๋ก์€ ๋‹จ์ˆœํžˆ ์—ฌ๋Ÿฌ ๊ตฌ๋ฌธ์„ ๋ฌถ๋Š” ์ง‘ํ•ฉ์ผ ๋ฟ์ด๋ฉฐ,
ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๊ทธ ์•ˆ์— ํฌํ•จ๋  ์ˆ˜ ์—†๋Š” ๋ณ„๋„์˜ ๋ฌธ๋ฒ• ์š”์†Œ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

js
// bad
if (currentUser) {
  // ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์‚ฌ์šฉ
  function test() {
    console.log('Nope.');
  }
}

// good
let test;

if (currentUser) {
  // ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์„ฑ
  test = () => {
    console.log('Yup.');
  };
}
  • bad: ECMA-262 ๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด, ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ ๋˜๋Š” ์ „์—ญ ์ฝ”๋“œ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, if, for, while ๋“ฑ ๋ธ”๋ก๋ฌธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ‘œ์ค€์ ์ด๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋™์ž‘์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

  • good: ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋ฉฐ, ์Šค์ฝ”ํ”„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ if ๋ธ”๋ก ๋‚ด๋ถ€๋กœ ํ•œ์ •๋œ๋‹ค.


5. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ arguments๋กœ ์ง“์ง€ ๋งˆ์„ธ์š” โ€‹

js
// bad
function foo(name, options, arguments) {
  // ...
}

// good
function foo(name, options, args) {
  // ...
}
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์•”๋ฌต์ ์œผ๋กœ ๋‚ด์žฅ ๊ฐ์ฒด arguments๋ฅผ ๊ฐ–๋Š”๋‹ค.
    (์ด ๊ฐ์ฒด์—๋Š” ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๋ชจ๋“  ์ธ์ž๊ฐ€ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.)
  • ๊ทธ๋Ÿฐ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ arguments๋กœ ์ง€์ •ํ•˜๋ฉด, ๋‚ด์žฅ arguments ๊ฐ์ฒด๋ฅผ ๋ฎ์–ด์จ๋ฒ„๋ ค ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  • ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , ๋‚ด๋ถ€ ๋กœ์ง์—์„œ ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, args๋‚˜ params์ฒ˜๋Ÿผ ์˜๋ฏธ ์žˆ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.


6. arguments ๋Œ€์‹  Rest ๋ฌธ๋ฒ•(...) ์‚ฌ์šฉ โ€‹

eslint: prefer-rest-params

js
// bad
function concatenateAll() {
  const args = Array.prototype.slice.call(arguments);
  return args.join('');
}

// good
function concatenateAll(...args) {
  return args.join('');
}
  • arguments๋Š” ๋ฐฐ์—ด์ด ์•„๋‹Œ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋‹ค.
  • ๋ฐ˜๋ฉด ...args๋Š” ์ง„์งœ ๋ฐฐ์—ด๋กœ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ์ฆ‰์‹œ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ rest ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์–ด๋–ค ์ธ์ž๋“ค์„ ๋ชจ์œผ๋Š”์ง€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์˜๋„ ์ „๋‹ฌ๋ ฅ์ด ํ›จ์”ฌ ๋†’์•„์ง„๋‹ค.
  • arguments๋Š” ๊ณผ๊ฑฐ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ๋‚จ์•„ ์žˆ๋Š” ๊ตฌ๋ฌธ์ด๊ณ , ํ˜„๋Œ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” rest parameters๊ฐ€ ๋Œ€์ฒดํ•œ๋‹ค.

7. ํ•จ์ˆ˜ ์ธ์ž๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋ง๊ณ  ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜(default) ์‚ฌ์šฉ โ€‹

js
// really bad
function handleThings(opts) {
  // ์ธ์ž๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ณธ ์ฐธ์กฐ๋ฅผ ์˜ค์—ผ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  // ๋” ์•ˆ ์ข‹์€ ๊ฒฝ์šฐ: opts๊ฐ€ falsy์ผ ๋•Œ {}๋กœ ๋ฎ์–ด์จ์„œ
  // ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  opts = opts || {};
  // ...
}

// still bad
function handleThings(opts) {
  if (opts === void 0) {
    opts = {};
  }
  // ...
}

// good
function handleThings(opts = {}) {
  // ์•ˆ์ „ํ•˜๊ณ  ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•œ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
}
  • ์ธ์ž๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ž˜ ํ˜ธ์ถœ๋ถ€์—์„œ ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋‚˜ ๊ฐ’์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ๊ธฐ๋ณธ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ๊ฐ€ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์„ ์–ธ์ ์ด ๋œ๋‹ค.

8. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ”ผํ•˜๊ธฐ โ€‹

js
var b = 1;

// bad
function count(a = b++) {
  console.log(a);
}

count(); // 1
count(); // 2
count(3); // 3
count(); // 3
  • ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์•ˆ์ •์ ์ธ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€, ์‹คํ–‰ ์‹œ์ ๋งˆ๋‹ค ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ณณ์ด ์•„๋‹ˆ๋‹ค.
  • ์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ b++๊ณผ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ‘œํ˜„์‹์„ ๋„ฃ์œผ๋ฉด ํ˜ธ์ถœ ์ˆœ์„œ๋‚˜ ์ธ์ž ์œ ๋ฌด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์€ ํ•ญ์ƒ ๊ณ ์ •๋œ ์ƒ์ˆ˜๋‚˜ ์ˆœ์ˆ˜ํ•œ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉ

9. ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ๋’ค์— โ€‹

eslint: default-param-last

js
// bad
function handleThings(opts = {}, name) {
  // ...
}

// good
function handleThings(name, opts = {}) {
  // ...
}
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.

10. Function ์ƒ์„ฑ์ž ์‚ฌ์šฉ ๊ธˆ์ง€ โ€‹

eslint: no-new-func

js
// bad
var add = new Function('a', 'b', 'return a + b');

// still bad
var subtract = Function('a', 'b', 'return a - b');
  • Function ์ƒ์„ฑ์ž๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ›์•„ ๋Ÿฐํƒ€์ž„์— ์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ eval()์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋ณด์•ˆ ์ทจ์•ฝ์ , ๋””๋ฒ„๊น…/์„ฑ๋Šฅ ๋ฌธ์ œ, ์Šค์ฝ”ํ”„ ์ฐจ์ด ๋“ฑ์˜ ์ด์œ ๋กœ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•œ๋‹ค.

11. ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ๊ณต๋ฐฑ ์ถ”๊ฐ€ โ€‹

eslint: space-before-function-paren space-before-blocks

js
// good
const x = function () {};
const y = function a() {};
  • ๊ณต๋ฐฑ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„ ์ถ”๊ฐ€ยท์‚ญ์ œ ์‹œ ์ˆ˜์ • ๋ฒ”์œ„๊ฐ€ ์ตœ์†Œํ™”๋œ๋‹ค.

12. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋งˆ์„ธ์š” โ€‹

eslint: no-param-reassign

js
// bad
// f1 ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ง์ ‘ ๋ฐ”๊พผ๋‹ค.
function f1(obj) {
  obj.key = 1;
}

// good
// f2๋Š” ์ „๋‹ฌ๋œ obj๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ์ฒด ์•ˆ์— key๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ฝ๊ธฐ๋งŒ ํ•œ๋‹ค.
function f2(obj) {
  const key = Object.prototype.hasOwnProperty.call(obj, 'key') ? obj.key : 1;
}
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด ์›๋ž˜ ํ˜ธ์ถœ์ฒ˜์—์„œ ์›์น˜ ์•Š๋Š” ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

13. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์žฌํ• ๋‹นํ•˜์ง€ ๋งˆ์„ธ์š” โ€‹

eslint: no-param-reassign

js
// bad
// ๋งค๊ฐœ๋ณ€์ˆ˜ a๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ์žฌํ• ๋‹นํ•จ
// โ†’ ์›๋ž˜ ์ธ์ž ๊ฐ’์ด ๋ฎ์–ด์จ์ง€๊ณ , ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ์ดˆ๋ž˜ํ•œ๋‹ค.
function f1(a) {
  a = 1; // ๋งค๊ฐœ๋ณ€์ˆ˜ a๋ฅผ ๊ฐ•์ œ๋กœ 1๋กœ ๋ฐ”๊ฟˆ
  // ...
}

// falsy ๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด a๋ฅผ 1๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆผ
// โ†’ ํ˜ธ์ถœ๋ถ€ ์ž…์žฅ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ธ์ž๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์˜ˆ์ƒํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
function f2(a) {
  if (!a) {
    a = 1; // ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”€
  }
  // ...
}

// good
// ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ b์— ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉ
// โ†’ ์›๋ณธ a๋Š” ์œ ์ง€๋˜๋ฉฐ, ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ
function f3(a) {
  const b = a || 1;
  // ...
}

// ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ๋ฒ• ์‚ฌ์šฉ
// โ†’ ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€์—์„œ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด ์žฌํ• ๋‹น ๋กœ์ง ์ž์ฒด๋ฅผ ์ œ๊ฑฐ
function f4(a = 1) {
  // ...
}
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์žฌํ• ๋‹นํ•˜๋ฉด, ์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋œ ์›๋ž˜ ์ธ์ž ์˜๋ฏธ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
  • ํŠนํžˆ arguments ๊ฐ์ฒด๋‚˜ ์ตœ์ ํ™” ์—”์ง„(V8 ๋“ฑ)์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์ด ์žˆ๋‹ค.

14. ๊ฐ€๋ณ€ ์ธ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๊ฐœ ์—ฐ์‚ฐ์ž ... ์‚ฌ์šฉ โ€‹

eslint: prefer-spread

js
// bad
const x = [1, 2, 3, 4, 5];
console.log.apply(console, x);

// good
const x = [1, 2, 3, 4, 5];
console.log(...x);

// bad
new (Function.prototype.bind.apply(Date, [null, 2016, 8, 5]))();

// good
new Date(...[2016, 8, 5]);
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , new์™€ apply()๋ฅผ ํ•จ๊ป˜ ์“ฐ๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๐Ÿงฉ apply()๋Š” ์›๋ž˜ ์™œ ์ผ์„๊นŒ?

apply()๋Š” ํ•จ์ˆ˜์— ๋ฐฐ์—ด ํ˜•ํƒœ์˜ ์ธ์ž๋“ค์„ ํ•˜๋‚˜์”ฉ ํ’€์–ด์„œ ์ „๋‹ฌํ•  ๋•Œ ์“ฐ๋˜ ์˜›๋‚  ๋ฐฉ์‹์ด๋‹ค.

js
const nums = [1, 2, 3];

Math.max.apply(null, nums); // ์ตœ๋Œ€๊ฐ’ 3
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž: ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(this)
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž: ์ธ์ž ๋ฆฌ์ŠคํŠธ (๋ฐฐ์—ด ๋˜๋Š” ๋ฐฐ์—ด ์œ ์‚ฌ ๊ฐ์ฒด)

์ฆ‰, apply()๋Š” this ์ง€์ •, ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ํŽผ์ณ์„œ ์ „๋‹ฌ ๋‘ ์—ญํ• ์„ ๋™์‹œ์— ํ–ˆ๋‹ค.


... ์ „๊ฐœ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์–ด์„œ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์กŒ๋‹ค.

js
const nums = [1, 2, 3];

// good
Math.max(...nums); // 3
  • ...nums๋Š” ๋ฐฐ์—ด์„ ์ž๋™์œผ๋กœ ํŽผ์ณ์คŒ
  • this๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ๊ฐ€๋…์„ฑ, ๊ฐ„๊ฒฐํ•จ, ๋””๋ฒ„๊น… ๋ชจ๋‘ ์ด ๋ฐฉ์‹์ด ํ›จ์”ฌ ์šฐ์ˆ˜

apply()๋Š” ํŠนํžˆ new์™€ ํ•จ๊ป˜ ์“ธ ์ˆ˜ ์—†๋‹ค.

js
// new + apply()๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Œ
const args = [2016, 8, 5];
new Date.apply(null, args); // TypeError ๋ฐœ์ƒ
  • apply()๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ‰๋‚ด๋‚ด๋Š” ๋ฉ”์„œ๋“œ๋ผ์„œ, ์ƒ์„ฑ์ž ํ˜ธ์ถœ(new)๊ณผ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

์ „๊ฐœ ์—ฐ์‚ฐ์ž๋Š” ์ด๋Ÿฐ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐ

js
const args = [2016, 8, 5];
const date = new Date(...args); // ๋™์ž‘
  • ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœ์—์„œ๋„ ๋™์ž‘ํ•œ๋‹ค.
  • apply()์ฒ˜๋Ÿผ Function.prototype.bind๋ฅผ ์–ต์ง€๋กœ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ตฌ๋ถ„์˜ˆ์‹œํŠน์ง•
apply()console.log.apply(console, arr)this๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•จ, new ๋ถˆ๊ฐ€๋Šฅ
์ „๊ฐœ ์—ฐ์‚ฐ์žconsole.log(...arr)๊ฐ„๊ฒฐ, ์•ˆ์ „, new๋„ ๊ฐ€๋Šฅ
๋ณต์žกํ•œ ๋ฐฉ์‹new (Function.prototype.bind.apply(Date, [null, 2016, 8, 5]))()๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•จ
๊น”๋”ํ•œ ๋ฐฉ์‹new Date(...[2016, 8, 5])์ฝ๊ธฐ ์‰ฝ๊ณ  ํ‘œ์ค€์ ์ธ ์ฝ”๋“œ

์ „๊ฐœ ์—ฐ์‚ฐ์ž(...)๋Š” ํ˜„๋Œ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€์ ์ธ ์ธ์ž ์ „๋‹ฌ ๋ฐฉ์‹์ด๋‹ค.
apply()๋ณด๋‹ค ์งง๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ, new์™€๋„ ํ˜ธํ™˜๋˜๋ฏ€๋กœ ์ผ๊ด€๋œ ๋ฌธ๋ฒ•์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.


15. ์—ฌ๋Ÿฌ ์ค„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ•ญ๋ชฉ๋ณ„๋กœ ํ•œ ์ค„์”ฉ ์ •๋ ฌ โ€‹

eslint: function-paren-newline

  • ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์นœ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋‚˜ ํ˜ธ์ถœ์€ ๋ฐฐ์—ด, ๊ฐ์ฒด ๋“ฑ ๋‹ค๋ฅธ ๋ฉ€ํ‹ฐ๋ผ์ธ ๋ฆฌ์ŠคํŠธ์™€ ๋™์ผํ•˜๊ฒŒ ๊ฐ ์ธ์ž๋ฅผ ํ•œ ์ค„์”ฉ ๋ฐฐ์น˜ํ•œ๋‹ค.
  • ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๋งž์ถ”๊ณ , ํ•จ์ˆ˜ ์ธ์ž์—๋Š” ํŠธ๋ ˆ์ผ๋ง ์ฝค๋งˆ ,๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ธ์ž๊ฐ€ ์งง๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ ํ•œ ์ค„๋กœ ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค.