Function - wooyeonhui/Yeonny GitHub Wiki
* ํจ์๋ ์ด๋ค ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ํ์ํ ์ผ๋ จ์ ๊ตฌ๋ฌธ๋ค์ ๊ทธ๋ฃนํํ๊ธฐ ์ํ ๊ฐ๋ ์ด๋ค. ๋ง์ผ ์คํฌ๋ฆฝํธ์ ๋ค๋ฅธ ๋ถ๋ถ์์๋ ๋์ผํ ์์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํด์ผ ํ๋ค๋ฉด(๋์ผํ ๊ตฌ๋ฌธ์ ๊ณ์ํด์ ๋ฐ๋ณต ์์ฑํ๋ ๊ฒ ์ด ์๋๋ผ) ๋ฏธ๋ฆฌ ์์ฑ๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.(์ฝ๋์ ์ฌ์ฌ์ฉ) * ํจ์์ ์ผ๋ฐ์ ๊ธฐ๋ฅ์ ํน์ ์์ ์ ์ํํ๋๊ตฌ๋ฌธ๋ค์ ์งํฉ์ ์ ์ํ๊ณ ํ์์์ ํธ์ถํ์ฌ ํ์ํ ๊ฐ ๋๋ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ผ๋ฐ์ ๊ธฐ๋ฅ(์ฝ๋์ ์ฌ์ฌ์ฉ) ์ด์ธ์ ๊ฐ์ฒด ์์ฑ,๊ฐ์ฒด์ ํ์ ์ง์ (๋ฉ์๋), ์ ๋ณด์ ๊ตฌ์ฑ ๋ฐ ์๋,ํด๋ก์ ,๋ชจ๋ํ ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค. ํจ์๋ ๊ตฌ๋ฌธ(statement)์ ์งํฉ์ผ๋ก ๋ชจ๋ํ์ ๊ทผ๊ฐ์ด ๋๋ค.์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ์๊ตฌ์ฌํญ์ ์งํฉ์ ์๋ฃ๊ตฌ์กฐ์ ํจ์์ ์งํฉ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด๋ค. * ํจ์๋ ๊ฐ์ฒด์ด๋ค. ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ตฌ๋ถ๋ ์ ์๋ ํน์ง์ ํธ์ถํ ์ ์๋ค๋ ๊ฒ์ด๋ค. * ํจ์๋ ๊ฐ์ฒด(์ผ๊ธ ๊ฐ์ฒด First-class object)์ด๋ฏ๋ก ๋ค๋ฅธ ๊ฐ๋ค ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ์ฆ ๋ณ์๋ ๊ฐ์ฒด,๋ฐฐ์ด ๋ฑ์ ์ ์ฅ๋ ์ ์๊ณ ๋ค๋ฅธ ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ก๋ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ํจ์์ ๋ฐํ๊ฐ์ด ๋ ์๋ ์๋ค.
ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ 3๊ฐ์ง๊ฐ ์๋ค.
* ํจ์์ ์ธ์(Function declaration) * ํจ์ํํ์(FUnction expression) * Function() ์์ฑ์ ํจ์
ํจ์์ ์ธ์์ ์ฌ์ฉํ ํจ์ ์ ์๋ function ํค์๋์ ์ดํ์ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
* ํจ์๋ช
ํจ์์ ์ธ์์ ๊ฒฝ์ฐ, ํจ์๋ช ์ ์๋ตํ ์ ์๋ค. ํจ์๋ช ์ ํจ์ ๋ชธ์ฒด์์ ์์ ์ ์ฌ๊ท์ (recursive)ํธ์ถํ๊ฑฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ฒ๊ฑฐ๊ฐ ํด๋น ํจ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ์์ก์์ ์ญํ ์ ํ๋ค.
* ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก
0๊ฐ ์ด์์ ๋ชฉ๋ก์ผ๋ก ๊ดํธ๋ก ๊ฐ์ธ๊ณ ์ฝค๋ง๋ก ๋ถ๋ฆฌํ๋ค. ๋ค๋ฅธ ์ธ์ด์์ ์ฐจ์ด์ ์ ๋งค๊ฐ๋ณ์์ ์๋ฃํ์ ๊ธฐ์ ํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ด ๋๋ฌธ์ ํจ์ ๋ชธ์ฒด ๋ด์์ ๋งค๊ฐ๋ฑ์์ ์๋ฃํ ์ฒดํฌ๊ฐ ํ์ํ ์ ์๋ค.
* ํจ์ ๋ชธ์ฒด
์ค์ ํจ์๊ฐ ํธ์ถ๋์์ ๋ ์คํ๋๋ ๊ตฌ๋ฌธ๋ค์ ์งํฉ์ด๋ค.์ค๊ดํธ({})๋ก ๊ตฌ๋ฌธ๋ค์ ๊ฐ์ธ๊ณ return ๋ฌธ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ ์ ์๋ค. ์ด๋ฅผ ๋ฐํ๊ฐ(return value)๋ผ ํ๋ค.
function square(number){
return number * number;
}
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด์ด๋ฏ๋ก ์๋์ ๊ฐ์ ํน์ง์ด ์๋ค.
* 1. ๋ฌด๋ช ์ ๋ฆฌํฐ๋ด๋ก ํํ์ด ๊ฐ๋ฅํ๋ค. * 2. ๋ณ์๋ ์๋ฃ ๊ตฌ์กฐ(๊ฐ์ฒด,๋ฐฐ์ด...)์ ์ ์ฅํ ์ ์๋ค. * 3. ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์๋ค. * 4. ๋ฐํ๊ฐ(return value)์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
ํจ์์ ์ผ๊ธ๊ฐ์ฒด ํน์ฑ์ ์ด์ฉํ์ฌ ํจ์ ๋ฆฌํฐ๋ด ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ๊ณ ๋ณ์์ ํ ๋นํ ์ ์๋๋ฐ ์ด๋ฌํ ๋ฐฉ์์ ํจ์ํํ์(Function expression)์ด๋ผ ํ๋ค. ํจ์์ ์ธ์์ผ๋ก ์ ์ํ ํจ์ square()๋ฅผ ํจ์ํํ์์ผ๋ก ์ ์ํ๋ฉด ์๋์ ๊ฐ๋ค.
var square = function(number) {
return number * number;
};
ํจ์ํํ์์ผ๋ก ์ ์ํ ํจ์๋ ํจ์๋ช ์ ์๋ตํ ์ ์๋ค.์ด๋ฌํ ํจ์๋ฅผ ์ต๋ช ํจ์(anonymous function)์ด๋ผ ํ๋ค.ํจ์ํํ์์์๋ ํจ์๋ช ์ ์๋ตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
// ๊ธฐ๋ช ํจ์ํํ์(named function expression) var foo = function multiply(a, b) {
return a * b;
}; // ์ต๋ช ํจ์ํํ์(anonymous function expression) var bar = function(a, b) {
return a * b;
};
console.log(foo(10, 5)); // 50 console.log(multiply(10, 5)); // Uncaught ReferenceError: multiply is not defined
ํจ์๋ ์ผ๊ธ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ณ์์ ํ ๋นํ ์ ์๋๋ฐ ์ด ๋ณ์๋ ํจ์๋ช ์ด ์๋๋ผ ํ ๋น๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ค. ํจ์ ํธ์ถ์ ์ด ๋ณ์๊ฐ ํจ์๋ช ์ฒ๋ผ ์ฌ์ฉ๋๋ค.
var foo = function(a, b) {
return a * b;
};
var bar = foo;
console.log(foo(10, 10)); // 100 console.log(bar(10, 10)); // 100
๋ณ์ bar์ ๋ณ์ foo๋ ๋์ผํ ์ต๋ช ํจ์์ ์ฐธ์กฐ๊ฐ์ ๊ฐ๋๋ค.
ํจ์๊ฐ ํ ๋น๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ ๊ธฐ๋ช ํจ์์ ํจ์๋ช ์ ์ฌ์ฉํด ํธ์ถํ๊ฒ ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.์ด๋ ํจ์ ํํ์์์ ์ฌ์ฉํ ํจ์๋ช ์ ์ธ๋ถ ์ฝ๋์์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.(์ฌ์ค์ ํจ์์ ์ธ์์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.) ํจ์ํํ์๊ณผ ํจ์์ ์ธ์์์ ์ฌ์ฉํ ํจ์๋ช ์ ํจ์ ๋ชธ์ฒด์์ ์์ ์ ์ฌ๊ท์ ํธ์ถํ๊ฑฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ฒ๊ฑฐ๊ฐ ํด๋น ํจ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ์๋ณ์์ ์ญํ ์ ํ๋ค. ํจ์์ ์ธ์์ผ๋ก ์ ์ํ square()์ ๊ฒฝ์ฐ, ํจ์๋ช ์ผ๋ก ํธ์ถํ ์ ์์๋๋ฐ ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋์ ๊ฐ์ ํจ์ ํํ์์ผ๋ก ํํ๊ฐ ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
var square = function square(number) {
return number * number;
};
ํจ์๋ช ๊ณผ ํจ์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง ๋ณ์๋ช ์ด ์ผ์นํ๋ฏ๋ก ํจ์๋ช ์ผ๋ก ํธ์ถ๋๋ ๋ฏ ๋ณด์ด์ง๋ง ์ฌ์ค์ ๋ณ์๋ช ์ผ๋ก ํธ์ถ๋ ๊ฒ์ด๋ค.
ํจ์์ ์ธ์์ผ๋ก ์ ์ํ square()์ ๊ฒฝ์ฐ,ํจ์๋ช ์ผ๋ก ํธ์ถํ ์ ์์๋๋ฐ ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋์ ๊ฐ์ ํจ์ํํ์์ผ๋ก ํ๋๊ฐ ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
var square = function square(number) {
return number * number;
};
ํจ์๋ช ๊ณผ ํจ์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง ๋ณ์๋ช ์ด ์ผ์นํ๋ฏ๋ก ํจ์๋ช ์ผ๋ก ํธ์ถ๋๋ ๋ฏ ๋ณด์ด์ง๋ง ์ฌ์ค์ ๋ณ์๋ช ์ผ๋ก ํธ์ถ๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ตญ ํจ์์ ์ธ์๋ ํจ์ ํํ์๊ณผ ๋์ผํ๊ฒ ํจ์ ๋ฆฌํฐ๋ด ๋ฐฉ์์ผ๋ก ์ ์๋๋ ๊ฒ์ด๋ค.
ํจ์ํํ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ ๋ ํจ์ ๋ฆฌํฐ๋ด ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ํจ์์ ์ธ์๋ ๋ด๋ถ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ธฐ๋ช ํจ์ํํ์์ผ๋ก ๋ณํํ๋ฏ์ค ๊ฒฐ๊ตญ ํจ์ ๋ฆฌํฐ๋ด๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ ํจ์์ ์ธ์๊ณผ ํจ์ํํ์์ ๋ชจ๋ ํจ์ ๋ฆฌํฐ๋ด ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ๋๋ฐ ์ด๊ฒ์ ๊ฒฐ๊ตญ ๋ด์ฅ ํจ์ Function() ์์ฑ์ ํจ์๋ก ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋จ์ํ์ํจ ๊ฒ์ด๋ค.
Function() ์์ฑ์ ํจ์๋ Function.prototype.constructor ํ๋กํผํฐ๋ก ์ ๊ทผํ ์ ์๋ค. Function() ์์ฑ์ ํจ์๋ก ํจ์๋ฅผ ์์ฑํ๋ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
new Function(arg1, arg2, โฆ argN, functionBody)
var square = new Function(โnumberโ, โreturn number * numberโ); console.log(square(10)); // 100
Function() ์์ฑ์ ํจ์๋ก ํจ์๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
3๊ฐ์ง์ ํจ์ ์ ์ ๋ฐฉ์์ ์์๋ณด์๋ค. ์ ์ ๋ฐฉ์์ ๋ฌ๋ผ๋ ๊ฒฐ๊ตญ Function() ์์ฑ์ ํจ์๋ฅผ ํตํด ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ๊น์ง ํ์ธํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด 3๊ฐ์ง ํจ์ ์ ์ ๋ฐฉ์์ ๋์ ๋ฐฉ์์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค.
3๊ฐ์ง ํจ์ ์ ์ ๋ฐฉ์์ ์์๋ณด์๋ค. ์ ์ ๋ฐฉ์์ ๋ฌ๋ผ๋ ๊ฒฐ๊ตญ Function() ์์ฑ์ ํจ์๋ฅผ ํตํด ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ๊น์ง ํ์ธํ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด 3๊ฐ์ง ํจ์ ์ ์ ๋ฐฉ์์ ๋์ ๋ฐฉ์์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค.
var res = square(5);
function square(number) {
return number * number;
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ํจ์์ ์ธ์์ผ๋ก ํจ์๊ฐ ์ ์๋๊ธฐ ์ด์ ์ ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค. ํจ์ ์ ์ธ์ ์์น์๋ ์๊ด์์ด ์ฝ๋ ๋ด ์ด๋ ๊ณณ์์๋ ์ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ฐ ์ด๊ฒ์ ํจ์ ํธ์ด์คํ (Function Hoisting)์ด๋ผ ํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ES6์ let,const๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์ ์ธ(var,let,const,function,function*,class)์ ํธ์ด์คํ (Hoisting)ํ๋ค. ํธ์ด์คํ ์ด๋ var ์ ์ธ๋ฌธ์ด๋ function ์ ์ธ๋ฌธ ๋ฑ์ ํด๋น Scope์ ๋งจ ์๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๋งํ๋ค. ์ฆ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ var ์ ์ธ๋ฌธ๊ณผ function ์ ์ธ๋ฌธ์ ํด๋น ์ค์ฝํ์ ๋งจ์๋ก ์ฎ๊ธด๋ค.
ํจ์์ ์ธ์์ผ๋ก ์ ์๋ ํจ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋ฉ๋๋ ์์ ์ ๋ฐ๋ก ์ด๊ธฐํํ๊ณ ์ด๋ฅผ VO(variable object)์ ์ ์ฅํ๋ค.์ฆ,ํจ์ ์ ์ธ,์ด๊ธฐํ,ํ ๋น์ด ํ๋ฒ์ ์ด๋ฃจ์ด์ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํจ์ ์ ์ธ์ ์์น์๋ ์๊ด์์ด ์์ค ๋ด ์ด๋ ๊ณณ์์๋ ์ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
๋ค์์ ํจ์ํํ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ ๊ฒฝ์ฐ์ด๋ค.
var res = square(5); // TypeError: square is not a function
var square = function(number) {
return number * number;
}
ํจ์์ ์ธ์์ ๊ฒฝ์ฐ์๋ ๋ฌ๋ฆฌ TypeError๊ฐ ๋ฐ์ํ์๋ค. ํจ์ํํ์์ ๊ฒฝ์ฐ ํจ์ ํธ์ด์คํ ์ด ์๋๋ผ ๋ณ์ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
> ๋ณ์ ํธ์ด์คํ ์ ๋ณ์ ์์ฑ ๋ฐ ์ด๊ธฐํ์ ํ ๋น์ด ๋ถ๋ฆฌ๋์ด ์งํ๋๋ค. ํธ์ด์คํ ๋ ๋ณ์๋ undefined๋ก ์ด๊ธฐํ ๋๊ณ ์ค์ ๊ฐ์ ํ ๋น์ ํ ๋น๋ฌธ์์ ์ด๋ฃจ์ด์ง๋ค.
ํจ์ํํ์์ ํจ์์ ์ธ์๊ณ ํ๋ ๋ฌ๋ฆฌ ์คํฌ๋ฆฝํธ ๋ก๋ฉ ์์ ์ ๋ณ์ ๊ฐ์ฒด(VO)์ ํจ์๋ฅผ ํ ๋นํ์ง ์๊ณ runtime์ ํด์๋๊ณ ์คํ๋๋ฏ๋ก ์ด ๋๊ฐ์ง๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์ ์ค์ํ๋ค.
JavaScript : The Good Parts์ ์ ์์ด๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ถ์์์ธ ๋๊ธ๋ฌ์ค ํฌ๋ฝํฌ๋(Douglas Crockford)๋ ์ด์ ๊ฐ์ ๋ฌธ์ ๋๋ฌธ์ ํจ์ํํ์๋ง์ ์ฌ์ฉํ ๊ฒ์ ๊ถ๊ณ ํ๊ณ ์๋ค. ํจ์ ํธ์ด์คํ ์ด ํจ์ ํธ์ถ ์ ๋ฐ๋์ ํจ์๋ฅผ ์ ์ธํ์ฌ์ผ ํ๋ค๋ ๊ท์น์ ๋ฌด์ํ๋ฏ๋ก ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๊ฒ ๋ง๋ค ์ ์๋ค๊ณ ์ง์ ํ๋ค.
๋ํ ํจ์์ ์ธ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ๋ฉด ์ฌ์ฉํ๊ธฐ์ ์ฝ์ง๋ง ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋๋ฌด ๋ง์ ์ฝ๋๋ฅผ ๋ณ์ ๊ฐ์ฒด(VO)์ ์ ์ฅํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์๋๋ ํ์ ํ ๋จ์ด์ง ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ ํ์๊ฐ ์๋ค.
์ผ๊ธ ๊ฐ์ฒด(First-class object)๋ ์์ฑ,๋์ ,์ฐ์ฐ,์ธ์ ๋๋ ๋ฐํ๊ฐ์ผ๋ก์์ ์ ๋ฌ ๋ฑ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ธฐ๋ณธ์ ์กฐ์์ ์ ํ์์ด ์ฌ์ฉํ ์ ์๋ ๋์์ ์๋ฏธํ๋ค.๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์ผ๊ธ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ๋ค.
* 1. ๋ฌด๋ช ์ ๋ฆฌํฐ๋ด๋ก ํํ์ด ๊ฐ๋ฅํ๋ค. * 2. ๋ณ์๋ ์๋ฃ ๊ตฌ์กฐ(๊ฐ์ฒด, ๋ฐฐ์ด ...)์ ์ ์ฅํ ์ ์๋ค. * 3. ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์๋ค. * 4. ๋ฐํ๊ฐ(return value)์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
// 1. ๋ฌด๋ช ์ ๋ฆฌํฐ๋ด๋ก ํํ์ด ๊ฐ๋ฅํ๋ค. // 2. ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ๋ด์ ์ ์๋ค. var increase = function(num) {
return num + 1;
};
var decrease = function(num){
return num - 1;
};
var obj = {
increase: increase, decrease: decrease
};
// 2. ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ํ ์ ์๋ค. function calc(func, num){
return func(num);
}
console.log(calc(increase, 1)); console.log(calc(decrease, 1));
// 3. ๋ฐํ๊ฐ(return value)์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. function calc(mode){
var funcs = { plus: function(left, right){ return left + right; }, minus: function(left, right){ return left - right; } }; return funcs[mode];
} console.log(calc(โplusโ)(2,1)); console.log(calc(โminusโ)(2,1)); //์ฝ๋๋ณด๊ธฐ!!!!!!
Javascript์ ํจ์๋ ์์ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ฏ๋ก Javascript์ ํจ์๋ ์ผ๊ธ๊ฐ์ฒด์ด๋ค.๋ฐ๋ผ์ Javascript์ ํจ์๋ ํก์ฌ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ฝ๋์ ์ด๋์๋ ์ง ์ ์ ํ ์ ์๋ค.
ํจ์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ ์ง๋ ํน์ง์ ํธ์ถํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
ํจ์์ ์์ ์คํ์ ์ํด ์ถ๊ฐ์ ์ธ ์ ๋ณด๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ค.๋งค๊ฐ๋ณ์๋ ํจ์ ๋ด์์ ๋ณ์์ ๋์ผํ๊ฒ ๋์ํ๋ค.
๋งค๊ฐ๋ณ์๋ ํจ์ ๋ด์์ ๋ณ์์ ๋์ผํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ฉฐ ์ ๋ฌ๋์ด์ง ์ธ์๋ ๋งค๊ฐ๋ณ์์ ํ ๋น๋๋ค. ๋ง์ฝ ์ธ์๊ฐ ์ ๋ฌ๋์ง ์์ผ๋ฉด ๋งค๊ฐ๋ณ์๋ undefined๋ก ์ด๊ธฐํ๋๋ค.
var foo = function (p1, p2) {
console.log(p1, p2);
};
foo(1); // 1 undefined
Primitives(๊ธฐ๋ณธ์๋ฃํ) ์ธ์๋ Call-by-value(๊ฐ์ ์ํ ํธ์ถ)๋ก ๋์ํ๋ค. ์ด๋ ํจ์ ํธ์ถ ์ ๊ธฐ๋ณธ์๋ฃํ ์ธ์๋ฅผ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ณต์ฌํ์ฌ ํจ์๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ ๋ฌ์ด ์๋ฃ๋ ๊ธฐ๋ณธ์์ํ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
function foo(primitive) {
primitive += 1; return primitive;
}
var x = 0;
console.log(foo(x)); // 1 console.log(x); // 0
๊ฐ์ฒด ํ์ (์ฐธ์กฐ ํ์ ) ์ธ์๋ Call-by-reference(์ฐธ์กฐ์ ์ํ ํธ์ถ)๋ก ๋์ํ๋ค. ์ด๋ ํจ์ ํธ์ถ ์ ์ฐธ์กฐ ํ์ ์ธ์๋ฅผ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋ณต์ฌ๋์ง ์๊ณ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ด ๋งค๊ฐ๋ณ์์ ์ ์ฅ๋์ด ํจ์๋ก ์ ๋ฌ๋๋ ๋ฐฉ์์ด๋ค. ์ด๋ ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์์ ์ฐธ์กฐ๊ฐ์ด ์ด์ฉํ์ฌ ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ์ ๋ ์ ์๋์ด์ง ์ฐธ์กฐํ์ ์ธ์๊ฐ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
function changeVal(primitive, obj) {
primitive += 100; obj.name = 'Kim'; obj.gender = 'female';
}
var num = 100; var obj = {
name: 'Lee', gender: 'male'
};
console.log(num); // 100 console.log(obj); // Object {name: โLeeโ, gender: โmaleโ}
changeVal(num, obj);
console.log(num); // 100 console.log(obj); // Object {name: โKimโ, gender: โfemaleโ}
ํจ์๋ ์์ ์ ํธ์ถํ ์ฝ๋์๊ฒ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ(return)ํ ์ ์๋ค.
* return ํค์๋๋ ํจ์๋ฅผ ํธ์ถํ ์ฝ๋์๊ฒ ๊ฐ์ ๋ฐํํ ๋ ์ฌ์ฉํ๋ค. * ํจ์๋ ๋ฐฐ์ด ๋ฑ์ ์ด์ฉํ์ฌ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ฆฌํดํ ์ ์๋ค. * ํจ์๋ ๋ฐํ์ ์๋ตํ ์ ์๋ค.์ด๋ ํจ์๋ ์๋ฌต์ ์ผ๋ก undefined๋ฅผ ๋ฐํํ๋ค. * ์๋ฐ์คํฌ๋ฆฝํธ ํด์๊ธฐ๋ return ํค์๋๋ฅผ ๋ง๋๋ฉด ํจ์์ ์คํ์ ์ค๋จํ ํ,ํจ์๋ฅผ ํธ์ถํ ์ฝ๋๋ก ๋๋์๊ฐ๋ค.๋ง์ผ return ํค์๋ ์ดํ์ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ด ์กด์ฌํ๋ฉด ๊ทธ ๊ตฌ๋ฌธ์ ์คํ๋์ง ์๋๋ค.
function calculateArea(width, height) {
var area = width * height; return area; // ๋จ์ผ ๊ฐ์ ๋ฐํ
} console.log(calculateArea(3, 5)); // 15 console.log(calculateArea(8, 5)); // 40
function getSize(width, height, depth) {
var area = width * height; var volume = width * height * depth; return [area, volume]; // ๋ณต์ ๊ฐ์ ๋ฐํ
}
console.log(โarea is โ + getSize(3, 2, 3)); // area is 6 console.log(โvolume is โ + getSize(3, 2, 3)); // volume is 18
ํจ์๋ ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ํจ์๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๋ค.
function square(number) {
return number * number;
}
square.x = 10; square.y = 20;
console.log(square.x, square.y);
ํจ์๋ ์ผ๋ฐ ๊ฐ์ฒด์๋ ๋ค๋ฅธ ํจ์๋ง์ ํ์ค ํ๋กํผํฐ๋ฅผ ๊ฐ๋๋ค.
function square(number) {
return number * number;
} console.dir(square);
์ฌ๋ฌ๊ฐ์ง ํ๋กํผํฐ๋ฅผ ํ์ธํ ์ ์๋๋ฐ ์ด๋ค ์ค length,prototype ํ๋กํผํฐ๋ ECMAScript spec์์ ์ ํ ํ์ค ํ๋กํผํฐ์ด๋ค. ๋๋จธ์ง ํ๋กํผํฐ๋ ECMAScript ํ์ค spec์ ์๋๋ค.
arguments ๊ฐ์ฒด๋ ํจ์ ํธ์ถ ์ ์ ๋ฌ๋ ์ธ์(argument)๋ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์คํ๊ฐ๋ฅํ(iterable) ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด(array-like object)์ด๋ค. ํจ์ ๊ฐ์ฒด์ arguments ํ๋กํผํฐ๋ arguments ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ง๋ฉฐ ํจ์ ๋ด๋ถ์์ ์ง์ญ๋ณ์์ฒ๋ผ ์ฌ์ฉ๋๋ค. ์ฆ ํจ์ ์ธ๋ถ์์๋ ์ฌ์ฉํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ํธ์ถ ์ ํจ์ ์ ์์ ๋ฐ๋ผ ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
function multiply(x, y) {
console.log(arguments); return x * y;
}
console.log(multiply()); // {} console.log(multiply(1)); // { โ0โ: 1 } console.log(multiply(1,2)); // { โ0โ: 1, โ1โ: 2 } console.log(multiply(1,2,3));// { โ0โ: 1, โ1โ: 2, โ2โ: 3 }