๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JavaScript

[JavaScript] ํ•จ์ˆ˜์™€ ์ผ๊ธ‰ ๊ฐ์ฒด

๋ฐ˜์‘ํ˜•

๐Ÿ€ ์ผ๊ธ‰ ๊ฐ์ฒด

  • ๋ฌด๋ช…์˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.(๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ์ด ๊ฐ€๋Šฅ)
  • ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ(๊ฐ์ฒด, ๋ฐฐ์—ด)์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ์œ„์™€ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋‹ค.

์ด๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ,๊ฐ์ฒด๋Š” ๊ฐ’์ด์ด๋ฏ€๋กœ ํ•จ์ˆ˜๋„ ๊ฐ’๊ณผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ผ๋ฉด ์–ด๋””์„œ๋“ ์ง€ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , ๋Ÿฐํƒ€์ž„์— ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ํ‰๊ฐ€๋œ๋‹ค.

์•„๋ž˜๋Š” ๊ฐ’์ด ์‚ฌ์šฉ๋˜๋Š” ๊ณณ์ด๋‹ค.

  • ๋ณ€์ˆ˜ ํ• ๋‹น๋ฌธ
  • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’
  • ๋ฐฐ์—ด์˜ ์š”์†Œ
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ธ์ˆ˜
  • ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๋ฌธ

์ผ๊ธ‰ ๊ฐ์ฒด๋กœ์„œ ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ ,

ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ธ๋ฐ ์ด๋Ÿฐ ํŠน์ง•์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ , ์ผ๋ฐ˜ ๊ฐ์ฒด์—๋Š” ์—†๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์†Œ์œ ํ•œ๋‹ค๋Š” ์ ์ด ์ผ๋ฐ˜ ๊ฐ์ฒด์™€์˜ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
์ˆœ์ˆ˜ ํ•จ์ˆ˜์™€ ๋ณด์กฐ ํ•จ์ˆ˜์˜ ์กฐํ•ฉ์„ ํ†ตํ•ด ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ตœ์†Œํ™”ํ•ด์„œ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ–ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„.
- ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜์กฑ๋ฌธ ์ œ๊ฑฐ๋ฅผ ํ†ตํ•ด ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ ,
- ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์–ต์ œํ•˜๊ฑฐ๋‚˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•ด์„œ ํ”ผํ•ด ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•จ.
- ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋ ค๋Š” ๋…ธ๋ ฅ์˜ ์ผํ™˜.

๐Ÿ€ ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ(์ผ๋ฐ˜ ๊ฐ์ฒด์—๋Š” ์—†๋Š” ํ”„๋กœํผํ‹ฐ)

์ด๋ฆ„๊ณผ ๋‚˜์ด๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด ์ž๊ธฐ์†Œ๊ฐœ๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜ introduce์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ

console.dir์™€ Object.getOwnPropertyDescriptors ๋ฉ”์„œ๋“œ๋กœ ๊ฐ๊ฐ ํ™•์ธํ•ด๋ณด์ž.

function introduce(name, age){
	return `์•ˆ๋…•ํ•˜์„ธ์š” ์ œ ์ด๋ฆ„์€ ${name}์ด๊ณ , ๋‚˜์ด๋Š” ${age}์‚ด ์ด์—์š”.`
}

console.dir(introduce) // ์•„๋ž˜ ์‚ฌ์ง„์„ ์ฐธ๊ณ 
console.log(Object.getOwnPropertyDescriptors(introduce)) // ์•„๋ž˜ ์‚ฌ์ง„์„ ์ฐธ๊ณ 

์œ„๊ฐ€ console.dir๋กœ ํ™•์ธํ•œ ๊ฒƒ, ์•„๋ž˜๊ฐ€  Object.getOwnPropertyDescriptors๋กœ ํ™•์ธํ•œ ๊ฒƒ

arguments, caller, length, name, prototype์€ ํ•จ์ˆ˜ ๊ฐ์ฒด ๊ณ ์œ ์˜ ํ”„๋กœํผํ‹ฐ๋‹ค. 

๐ŸŒฑ arguments

ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ arguments ํ”„๋กœํผํ‹ฐ ๊ฐ’์€ arguments ๊ฐ์ฒด๋‹ค.

arguments ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๋‹ค.

์ฐธ๊ณ ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

arguments์˜ Symbol.iterator ํ”„๋กœํผํ‹ฐ๋Š” arguments ๊ฐ์ฒด๋ฅผ ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋กœํผํ‹ฐ์ด๋‹ค. 

arguments ๊ฐ์ฒด๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ€๋ณ€ ์ธ์ž ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

function sum(){
	let sum = 0;
    
    for(let i = 0; i < arguments.length; i++){
    	res += arguments[i];
    }
    return res;
}

console.log(sum()); // 0
console.log(sum(1, 2)); // 3

๐ŸŒฑ caller

caller ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

function foo(func){
	return func();
}

function bar(){
	return 'caller : ' + bar.caller;
}

console.log(foo(bar)); // caller : function foo(func) { ... }
console.log(bar()); // caller : null

๐ŸŒฑ length

ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ length ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์„ ์–ธํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์œผ๋กœ

arguments ๊ฐ์ฒด์˜ length ํ”„๋กœํผํ‹ฐ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. (๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๊ณ„ ์—†์ด ๋ชจ๋“  ์ธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.) 

๐ŸŒฑ name  ํ”„๋กœํผํ‹ฐ

ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ name ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๊ณ  es5, es6๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

var namesFunc = function foo(){
	console.log(namedFunc.name); // foo
}

var anonymousFunc = function(){};
// es5 : name ํ”„๋กœํผํ‹ฐ๋Š” ๋นˆ ๋ฌธ์ž์—ด
// es6 : name ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง

console.log(anonymousFunc.name); // anonymousFunc

๐ŸŒฑ __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

๋ชจ๋“  ๊ฐ์ฒด๋Š” [[Prototype]]์ด๋ผ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ–๋Š”๋ฐ, ์ด๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

__proto__ ํ”„๋กœํผํ‹ฐ๋Š” [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋‹ค. 

const obj = {a : 1};

console.log(obj.__proto__ === Object.prototype); // true

console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('__proto__')); // false

๐ŸŒฑ prototype ํ”„๋กœํผํ‹ฐ

prototype ํ”„๋กœํผํ‹ฐ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด. ์ฆ‰ constructor๋งŒ์ด ์†Œ์œ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋‹ค. prototype ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋ฐ˜์‘ํ˜•

'JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] Webpack  (0) 2021.12.11
[JavaScript] ์ƒ์„ฑ์ž ํ•จ์ˆ˜  (0) 2021.11.21
[JavaScript] ๋นŒํŠธ์ธ ๊ฐ์ฒด  (0) 2021.11.05
[JavaScript] Symbol  (0) 2021.10.23
[JavaScript]์ „์—ญ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์   (0) 2021.10.06