Function

ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐ ํ˜ธ์ถœ

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์˜ ํ•จ์ˆ˜ ์„ ์–ธ

function(x) { return x * x; };

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋ฐฉ์‹์˜ ํ•จ์ˆ˜ ์„ ์–ธ

function square(x) { return x * x; };

โ—ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ๋ฐฉ์‹์˜ ํ•จ์ˆ˜ ์„ ์–ธ

const square = function(x) { return x * x; };

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜ ์ƒ์„ฑ

const square = new Function('x','return x * x'};

ํ•จ์ˆ˜ ํ˜ธ์ถœ

square(3) // 9

์ธ์ˆ˜

function distance(p,q) {
	var dx = q.x - p.x;
	var dy = q.y - p.y;
	return Math.sqrt(dx*dx+dy*dy);
}

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๋งŒ ํ˜ธ์ด์ŠคํŒ…

  • ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฒซ๋จธ๋ฆฌ๋กœ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค

  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜์˜ ์œ„์น˜์— ์ƒ๊ด€์—†์ด ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์ฝ”๋“œ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘

  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ˜ธ์ด์ŠคํŒ… ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ •์˜๋˜๊ธฐ ์ „์— ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค.

  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ๊ถŒ์žฅ

console.log(square(5)) // TypeError
const square = function(x) { return x*x;};
console.log(square(5)) // 25

ํ•จ์ˆ˜ ํŠน์ง•

ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋‹ค

  • ํ•จ์ˆ˜ square(x)๋Š” function(x) {return x*x;} ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ผ์ข…์˜ ๊ฐ์ฒด

  • ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด

var sq = square;
console.log(sq(5)); // 25

ํ•จ์ˆ˜๋Š” ๊ฐ’์ด๋‹ค

  • ๋ณ€์ˆ˜, ๋ฐฐ์—ด, ํ”„๋กœํผํ‹ฐ ๋“ฑ์— ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‹ค

  • ํ•จ์ˆ˜์˜ ์ธ์ž๋‚˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

  • ๋™์  ํ”„๋กœํผํ‹ฐ ํ• ๋‹น ๊ฐ€๋Šฅ

ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ

  • length : ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ •์ƒ์ ์ธ ์ธ์ž์˜ ๊ฐœ์ˆ˜

  • prototype: ๊ฐ์ฒด์˜ ๋ถ€๋ชจ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” [[Prototype]]๊ณผ ๋‹ค๋ฆ„. constructor ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ด. constructor ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ด. ํ•จ์ˆ˜(prototype) โ†” constructor

๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ

  • ๊ฐ’์˜ ์ „๋‹ฌ: ์ธ์ˆ˜์— ์›์‹œ ๊ฐ’(์—ฌ๊ธฐ์„œ๋Š” a = 3)์„ ๋„˜๊ธฐ๋ฉด ๊ทธ ๊ฐ’ ์ž์ฒด๊ฐ€ ์ธ์ž์— ์ „๋‹ฌ๋˜์–ด a์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค

function add1(x) { return x = x + 1;}
var a = 3;
var b = add1(a);
console.log("a = " + a + ", b = " + b); // a = 3, b = 4

์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ

  • ์ฐธ์กฐ์ „๋‹ฌ: ์ธ์ˆ˜์— ๊ฐ์ฒด(์—ฌ๊ธฐ์„œ๋Š” a={x:3, y:4})๋ฅผ ๋„˜๊ธฐ๋ฉด ์ฐธ์กฐ ๊ฐ’์„ p์— ๋Œ€์ž…ํ•˜๋ฏ€๋กœ p๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด a๊นŒ์ง€ ์ˆ˜์ •๋œ๋‹ค

function add1(p) { p.x = p.x + 1; p.y = p.y + 1; return p; }
var a = {x:3, y:4};
var b = add1(a);
console.log(a,b); // Object {x=4, y=5} Object{x=4, y=5}

๋งค๊ฐœ๋ณ€์ˆ˜(parameter; ์ธ์ž)

  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’๋“ค

// x, y๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” add ํ•จ์ˆ˜
function add(x,y) {
  return x+y
}

console.log(add(3,2)) // 5
console.log(add()) // NaN
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๋•Œ ์ƒ๊ธฐ๋Š” ์˜ˆ์™ธ์  ์ƒํ™ฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

function add(x=0,y=0) {
  return x+y
}
console.log(add()) // 0

๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„(Scope)

์–ดํœ˜์  ๋ฒ”์œ„: ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ๋ฌธ์œผ๋กœ ์œ ํšจ ๋ฒ”์œ„ ์ง€์ •

๋™์  ๋ฒ”์œ„: ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์œ ํšจ ๋ฒ”์œ„ ์ง€์ •

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ดํœ˜์  ๋ฒ”์œ„ ๋ฐฉ์‹์„ ์ฑ„ํƒ

์ „์—ญ ๋ณ€์ˆ˜: ํ•จ์ˆ˜ ๋ฐ”๊นฅ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜. ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ

์ง€์—ญ ๋ณ€์ˆ˜: ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์ธ์ž. ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€

  • ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ˆจ๊ฒจ์ง„๋‹ค

var a = "global";
function f() {
	var a = "local";
	console.log(a); // local
	return a;
}
f();
console.log(a); // global

ํด๋กœ์ €(closer)

  • ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋˜๊ณ , ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์„ ๋•Œ, ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅ

  • ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋“ค์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”์—†์ด ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

const counter = (() => {
  let i = 0;
  return () => ++i;
})();

console.log(counter());
console.log(counter());
console.log(counter());

ํ•จ์ˆ˜ ์•ˆ์˜ ๋ณ€์ˆ˜ ๋Œ์–ด์˜ฌ๋ฆผ

  • ํ•จ์ˆ˜ ์•ˆ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€๋Š” ํ•จ์ˆ˜์˜ ์ฒซ๋จธ๋ฆฌ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค.

ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ ์ƒ๋žต์‹œ ์ „์—ญ ๋ณ€์ˆ˜

  • ํ•จ์ˆ˜์•ˆ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ๋‹ค.

function f() {
	a = "loacl";
	console.log(a); // local
	return a;
}
f();
console.log(a); // local

๋ธ”๋ก ์œ ํšจ ๋ฒ”์œ„

  • let๊ณผ const๋Š” ES6๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ๋ณ€์ˆ˜ ์„ ์–ธ์ž๋กœ '์„ ์–ธ๋œ {...} ์•ˆ'์˜ '๋ธ”๋ก ์œ ํšจ ๋ฒ”์œ„'๋ฅผ ๊ฐ–๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค

  • let ์„ ์–ธ์ž: ๋ธ”๋ก ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š” ์ง€์—ญ ๋ณ€์ˆ˜ ์„ ์–ธ

    • ๋ณ€์ˆ˜ ๋Œ์–ด์˜ฌ๋ฆผ(ํ˜ธ์ด์ŠคํŒ…)์ด ๋˜์ง€ ์•Š๋Š”๋‹ค

  • const ์„ ์–ธ์ž: ๋ธ”๋ก ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋ฉด์„œ ํ•œ ๋ฒˆ๋งŒ ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธ

    • ์ƒ์ˆ˜ ๊ฐ’์€ ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ

    • ์ƒ์ˆ˜ ๊ฐ’์ด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ˆ˜์ • ๊ฐ€๋Šฅ

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ

  • ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด = ์ต๋ช… ํ•จ์ˆ˜ = ๋ฌด๋ช… ํ•จ์ˆ˜

var square = function(x) { return x * x;};

๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ

  • ๋ฉ”์„œ๋“œ: ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ค‘ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ๋‹ด๊ณ  ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์†ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ด์šฉํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ

var circle = {
	center: { x:1.0, y:2.0 },
	radius: 2.5,
	area: function() {
		return Math.PI * this.radius * this.radius;
	}
};

arguments ๊ฐ์ฒด

  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋–„ ์‚ฌ์šฉ๋œ ์ธ์ž๋“ค์ด ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด

const add = function (a, b) {
  console.log(arguments);
  return a + b;
};

console.log(add(1)); // {0: 1} NaN
console.log(add(1, 2)); // {0: 1, 1: 2} 3
console.log(add(1, 2, 3)) // {0: 1, 1: 2, 2: 3} 3

this ๋ฐ”์ธ๋”ฉ

  • ๊ฐ์ฒด ๋‚ด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ

    • ์˜ˆ์™ธ์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์—ฌ๋„ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์ผ ๊ฒฝ์šฐ ์Šค์Šค๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ „์—ญ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

    • ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์—ฌ๋„ ํ•จ์ˆ˜์—๊ฒŒ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ ์ „์—ญ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ (window ๊ฐ์ฒด)

  • ๋ฐ”์ธ๋”ฉ ํ•˜์ง€ ์•Š์œผ๋ฉด func2, func3์˜ this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด

var value = 100;

var myObject = {
  value: 1,
  func1: function () {
    this.value += 1;
    console.log(this.value);

    func2 = function () {
      this.value += 1;
      console.log(this.value);

      func3= function () {
        this.value += 1;
        console.log(this.value);
      }
      func3() // 3. 100+2 = 102
    }
    func2() // 2. 100+1 = 101
  }
}
myObject.func1() // 1. 1+1 = 2
var value = 100;

var myObject = {
  value: 1,
  func1: function () {
    var that = this; // this ๋ฐ”์ธ๋”ฉ
    this.value += 1;
    console.log(this.value);

    func2 = function () {
      that.value += 1;
      console.log(that.value);

      func3= function () {
        that.value += 1;
        console.log(that.value);
      }
      func3() // 3. 4
    }
    func2() // 2. 3
  }
}
myObject.func1() // 1. 2

call๊ณผ apply๋ฅผ ํ†ตํ•œ this ๋ฐ”์ธ๋”ฉ

  • thisArg: func()ํ˜ธ์ถœ์— ์‚ฌ์šฉํ•  this

  • call๊ณผ apply ์ฐจ์ด: call์€ ์ธ์ž๋ฅผ ๊ฐ๊ฐ ๋„˜๊ธฐ๊ณ , apply๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋„˜๊ธด๋‹ค.

func.call(thisArg[, arg1[, arg2[, ...]]])
func.apply(thisArg, [argsArray])

bind()๋ฅผ ํ†ตํ•œ ๋ฐ”์ธ๋”ฉ

  • this์™€ ์ดˆ๊ธฐ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„ ๋ฐ”์ธ๋”ฉ๋œ ์›๋ณธ ํ•จ์ˆ˜์˜ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜

  • ์‚ฌ์šฉ ์šฉ๋„

    1. ๋ฏธ๋ฆฌ this ๋ฐ”์ธ๋”ฉ

    2. ๋ถ€๋ถ„ ์ ์šฉ ํ•จ์ˆ˜ ์ƒ์„ฑ

    3. name ํ”„๋กœํผํ‹ฐ๋กœ bind()๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

func.bind(thisArg[, arg1[, arg2[, ...]]])
const newFunc = function () {}.bind(this);

์ƒ์„ฑ์ž ํ•จ์ˆ˜ new

  • Person() ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype -> Person.prototype ๊ฐ์ฒด

  • ์ƒ์„ฑ๋œ ๋นˆ ๊ฐ์ฒด์˜ [[prototype]] ์„ Person.prototype ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์—๋Š” ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์— this๊ฐ€ ๋ฐ”์ธ๋”ฉ

var person1 = new Person('john');
//person1์˜ [[prototype]] ->  Person.prototype ๊ฐ์ฒด

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹ ์ฐจ์ด

  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹ ๋ณ€์ˆ˜ = {...}์€ Object.prototype์„ ``proto`๋กœ ๊ฐ€์ง

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹ ๋ณ€์ˆ˜ = new Person()์€ Person.prototype์„ ``proto`๋กœ ๊ฐ€์ง

call๊ณผ apply๋ฅผ ํ†ตํ•œ this ๋ฐ”์ธ๋”ฉ

  • thisArg: func()ํ˜ธ์ถœ์— ์‚ฌ์šฉํ•  this

  • call๊ณผ apply ์ฐจ์ด: call์€ ์ธ์ž๋ฅผ ๊ฐ๊ฐ ๋„˜๊ธฐ๊ณ , apply๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋„˜๊ธด๋‹ค.

func.call(thisArg[, arg1[, arg2[, ...]]])
func.apply(thisArg, [argsArray])

... ์—ฐ์‚ฐ์ž(๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž)

  • ํ•จ์ˆ˜์—์„œ ์—ฌ๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ, ์ •์˜ํ•˜์ง€ ์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

function f(a, b, ...theArgs) {
  // โ€ฆ
}

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹

  • ํ•ด๋‹น ๊ฐ์ฒด์— ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด [[Prototype]]๋งํฌ๋ฅผ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—์„œ ๊ฒ€์ƒ‰

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹

  • hasOwnProperty()๋Š” myObject์˜ prototype -> Object.prototype์˜ ๋ฉ”์„œ๋“œ

var myObject = {
	name: 'foo'
}
console.log(myObject.hasOwnProperty('name')); // true

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹

  • hasOwnProperty()๋Š” Person()์˜ prototype -> Person.prototype -> Object.prototype์˜ ๋ฉ”์„œ๋“œ

function Person(name) {
    this.name = name;
}
var foo = new Person('foo')
console.log(foo.hasOwnProperty('name')); // true

๋‹ค์–‘ํ•œ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

  • this, super ๋ฐ”์ธ๋”ฉ ์—†์Œ

  • โ— methods๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

  • new.target ํ‚ค์›Œ๋“œ ์—†์Œ

  • ์Šค์ฝ”ํ”„ ์ง€์ •์— ์‚ฌ์šฉํ•˜๋Š” call, apply, bind methods ๋ถˆ๊ฐ€๋Šฅ

  • ์ƒ์„ฑ์ž ์‚ฌ์šฉ ๋ถˆ๊ฐ€

  • yield๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

 (param1, param2, โ€ฆ, paramN) => expression
 (param1, param2, โ€ฆ, paramN) => { return expression; }

๊ณ ์ฐจํ•จ์ˆ˜

  • ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜

์ฝœ๋ฐฑ(callback) ํ•จ์ˆ˜

  • ํŠน์ • ์กฐ๊ฑด, ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ (์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ)

  • ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ ธ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์ด๋ฏ€๋กœ this ๋ฐ”์ธ๋”ฉ์ด ์—†์ง€๋งŒ addEventListener ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” this ๋ฐ”์ธ๋”ฉ์ด ๋˜์–ด ์žˆ๋‹ค. -> ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ช…์‹œ์ ์œผ๋กœ this๋ฐ”์ธ๋”ฉ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ

  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜

    • eventlistener() ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ

    • setInterval() ํƒ€์ด๋จธ ํ•จ์ˆ˜

    • forEach(), map(), reduce ๋“ฑ ๋ฐฐ์—ด ํ•จ์ˆ˜

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํŠน์ง•

  1. ํ˜ธ์ถœ ์‹œ์ ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜์—๊ฒŒ ์žˆ๋‹ค.

  2. ์ธ์ž์™€ ๊ทธ ์ˆœ์„œ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ๋„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜์—๊ฒŒ ์žˆ๋‹ค.

setTimeout()

  • ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋‚˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰

  • ์‹คํ–‰์˜ ์ฃผ์ฒด๊ฐ€ ๋˜์–ด ํ•จ์ˆ˜ ์‹คํ–‰์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง

  • clearTimeout()์„ ํ†ตํ•ด ํƒ€์ด๋จธ ์ทจ์†Œ

ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜

var self = function () {
	console.log('a');
	return function () {
		console.log('b');
	}
}
self = self(); // a
self(); // b

ํ•จ์ˆ˜ ๋ฆฌํ„ด๊ฐ’

  1. ๋ฆฌํ„ด ๊ฐ’ ๋ฏธ์ง€์ • ์‹œ: ์ผ๋ฐ˜ ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ -> undefined

  2. ๋ฆฌํ„ด ๊ฐ’ ๋ฏธ์ง€์ • ์‹œ: ์ƒ์„ฑ์ž ํ•จ์ˆ˜ -> ์ƒ์„ฑ๋œ ๊ฐ์ฒด

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„ (IIFE)

  • ์ •์˜์™€ ๋™์‹œ์— ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜

    (function () {
        statements
    })();
(function (x) {
    console.log(x*x);
})(5); // 25

๋‚ด๋ถ€ ํ•จ์ˆ˜

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜

  • ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ž์‹ ์˜ ๋ถ€๋ชจ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ

  • ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

function parent() {
  var a = 1;
  var b = 2;
  function child() {
    var b = 3;

    console.log(a,b); 
  }
  child()
}
parent() // child() -> 1,3
child() // ReferenceError: child is not defined
  • ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

let func_parent = function () {
  var a = 1;
  var b = 2;
  function func_child() {
    var b = 3;

    console.log(a, b);
  }
  func_child();
  return func_child;
};
var inner = func_parent(); // ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋„˜๊ฒจ ๋ฐ›์Œ
console.log(inner); // ฦ’ func_child() {...}
inner(); // 1,3
  1. inner() ์‹คํ–‰

  2. func_child() ํ˜ธ์ถœ

  3. console.log(a, b);

  4. a๋Š” ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์•„ ๋ถ€๋ชจ ํ•จ์ˆ˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ (ํด๋กœ์ €) b๋Š” ์ •์˜๋˜์–ด ์žˆ์Œ

  5. 1,3 ์ถœ๋ ฅ

Last updated