-
Notifications
You must be signed in to change notification settings - Fork 0
inside_javascript_1
-
ํจ์ ์์ฑ ๋ฐฉ๋ฒ
-
ํจ์ ์ ์ธ๋ฌธ ๋ฐฉ์ (function statement)
function add(x, y) { return x + y; }
-
ํจ์ ํํ์ ๋ฐฉ์ (function expression)
- ํจ์๋ ํ๋์ ๊ฐ์ผ๋ก ์ทจ๊ธ๋๋ฏ๋ก ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
- ํํ์์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ํจ์ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์๋๋ฐ, ์ด๋ฅผ ์ต๋ช ํจ์ ํํ์์ด๋ผ ํ๋ค.
var add = function (x, y) { return x + y; }
-
Function() ์์ฑ์ ํจ์ ์ฌ์ฉ ๋ฐฉ์
- ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๋ฐฉ์
var add = new Function('x', 'y', 'return x + y');
-
-
ํจ์ ํธ์ด์คํ (Function Hoisting)
- ํจ์ ์ ์ธ๋ฌธ ๋ฐฉ์์ผ๋ก ์ ์ํ ํจ์๋ ์ฝ๋์ ๋งจ ์ฒ์์ผ๋ก ๋์ด์ฌ๋ ค์ง๊ฒ(hoisting) ๋๋ฏ๋ก ์ ์๊ฐ ๋์ง ์์ ์ํ์์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
add(2, 3); // ํธ์ถ ๊ฐ๋ฅ function add(x, y) { return x + y };
๋๊ธ๋ฌ์ค ํฌ๋ฝํฌ๋๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ด ๊ตฌ์กฐ๋ฅผ ์์ฑํ๊ฒ ๋ง๋ค์ ์์ผ๋ฏ๋ก, ํจ์ ํํ์ ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์๋ค.
-
ํจ์ ๊ฐ์ฒด
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์๋ ๊ฐ์ฒด๋ค. ๋ฐ๋ผ์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ/์ญ์ ํ ์ ์๋ค.
- ์ผ๋ฐ ๊ฐ์ฒด๋ ์๋์ ๊ฐ์ ๋์์ด ๊ฐ๋ฅํ๋ค.
- ๋ฆฌํฐ๋ด์ ์ํ ์์ฑ
- ๋ณ์๋ ๋ฐฐ์ด์ ์์, ๊ฐ์ฒด์ ํ๋กํผํฐ ๋ฑ์ ํ ๋น ๊ฐ๋ฅ
- ํจ์์ ์ธ์๋ก ์ ๋ฌ ๊ฐ๋ฅ
- ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ๋ฆฌํด ๊ฐ๋ฅ
- ๋์ ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์์ฑ ๋ฐ ํ ๋น ๊ธฐ๋ฅ
์ด ๊ฐ์ ํน์ง์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด(First Class) ๋ผ๊ณ ๋ถ๋ฅธ๋ค
์ผ๊ธ ๊ฐ์ฒด๋ ์์ ๋์ดํ ๊ธฐ๋ฅ์ ๋ชจ๋ ๋ง์กฑํ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.-
๋ณ์, ํ๋กํผํฐ์ ๊ฐ์ผ๋ก ํ ๋น
var foo = function () { return 100; }; // ๋ณ์์ ํ ๋น var obj = {}; obj.baz = function() { return 200; }; // ํ๋กํผํฐ์ ํ ๋น
-
ํจ์ ์ธ์๋ก ์ ๋ฌ
var foo = function(func) { func(); }; foo(function() { console.log('bar'); });
-
๋ฆฌํด๊ฐ์ผ๋ก ํ์ฉ
var foo = function() { return function () { console.log('this function is the return value'); }; }; var bar = foo(); bar();
-
ํจ์ ๊ฐ์ฒด์ ๊ธฐ๋ณธ ํ๋กํผํฐ
- ํจ์ ๊ฐ์ฒด๋ ์๋ ๋์ด๋ ๊ธฐ๋ณธ(๋ด๋ถ) ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
length, prototype(ํ์ค)
name, caller, arguments, [[Prototype]](๋นํ์ค)
ECMA ํ์ค์์๋ ํจ์ ๊ฐ์ฒด์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ Function.prototype ๊ฐ์ฒด๋ผ๊ณ ํ๋ฉฐ, ์ด๊ฒ ์ญ์ ํจ์ ๊ฐ์ฒด๋ผ๊ณ ์ ์ํ๊ณ ์๋ค.
-
ํจ์ ๊ฐ์ฒด์ ๋ถ๋ชจ( Internal Property
[[Prototype]]) > Function.prototype ๊ฐ์ฒด (ํจ์ ๊ฐ์ฒด) -
Function.prototype์ ๋ถ๋ชจ ( Internal Property
[[Prototype]]) > Object.prototype ๊ฐ์ฒด -
ECMAScript ๋ช ์ธ์๋ Function.prototype ๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์ผ ํ๋ ํ๋กํผํฐ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ์ ํ๊ณ ์๋ค.
- constructor ํ๋กํผํฐ
- toString() ๋ฉ์๋
- apply(thisArg, argArray) ๋ฉ์๋
- call(thisArg, [, arg1, [,arg2,]]) ๋ฉ์๋
- bind(thisArg, [, arg1, [,arg2,]]) ๋ฉ์๋
- ํจ์ ๊ฐ์ฒด๋ ์๋ ๋์ด๋ ๊ธฐ๋ณธ(๋ด๋ถ) ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
-
ํจ์์ ๋ค์ํ ํํ
- ์ฝ๋ฐฑ ํจ์ : ํจ์๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋๋ฑ ํน์ ์์ ์ ๋๋ฌํ์๋ ํธ์ถ๋๋๋ก ํ๋ ํจ์.
- ์ฆ์ ์ํ ํจ์ : ํจ์๋ฅผ ์ ์ํจ๊ณผ ๋์์ ์คํํ๋ ํจ์. ์ต์ด์ ํ๋ฒ์ ์คํ๋ง์ ํ์๋ก ํ๋ ์ด๊ธฐํ ์ฝ๋ ๋ถ๋ถ์ ์ฌ์ฉ.
- ๋ด๋ถ ํจ์ : ํจ์ ์ฝ๋ ๋ด๋ถ์ ๋ ๋ค์ ํจ์๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ๋ ํจ์.
-
ํธ์ถ ํจํด๊ณผ this ๋ฐ์ธ๋ฉ
-
๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋
this๋ ์์ ์ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค.var myObject = { name: 'foo', sayName: function() { console.log(this.name);} }; var otherObject = { name: 'bar' }; otherObject.sayName = myObject.sayName; myObject.sayName(); otherObject.sayName(); // ์ถ๋ ฅ ๊ฒฐ๊ณผ > foo > bar
-
ํจ์๋ฅผ ํธ์ถํ ๋
ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋ this๋ ์ ์ญ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค. (๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ window)
๋ด๋ถ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ this๋ ์ ์ญ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๋ณ์์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ค.var value = 100; var myObject = { value: 1, func1: function() { var that = this; // ๋ค๋ฅธ ๋ณ์์ ์ ์ฅ this.value += 1; func2 = function() { that.value += 1; } }}
-
์์ฑ์ ํจ์๋ฅผ ํธ์ถํ ๋ this ๋ฐ์ธ๋ฉ ์์ฑ์ ํจ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๋๋ฐ, ๊ธฐ์กด ํจ์์ new ์ฐ์ฐ์๋ฅผ ๋ถ์ฌ์ ํธ์ถํ๋ฉด ์์ฑ์ ํจ์๋ก ๋์ํ๋ค.
์ด๋ ์๋์ ๋ฌ๋ฆฌ ์์น ์์ ํจ์์ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ฑ์ ํจ์๋ก ์ ์๋จ์ ์๋ฆฌ๊ธฐ ์ํด ํจ์์ด๋ฆ์ ์ฒซ ๋ฌธ์๋ฅผ ๋๋ฌธ์๋ก ์ฐ๊ธฐ๋ฅผ ๊ถ์ฅํ๊ณ ์๋ค.// ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ฐ์ฒด ์์ฑ var foo = { name: 'foo', age: 35, gender: 'men' }; console.dir(foo); // ์์ฑ์ ํจ์๋ก ๊ฐ์ฒด ์์ฑ function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; } var bar = new Person('bar', 33, 'woman'); var baz = new Person('baz', 24, 'woman'); console.dir(bar); console.dir(baz); // ๋๋ฒ๊น > Object age: 35 gender: "man" name: "foo" __proto__: Object > Person age: 33 gender: "woman" name: "bar" __proto__: Person > Person age: 25 gender: "woman" name: "baz" __proto__: Person
- ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ์ฐจ์ด(๊ฐ์ฒด ๋ฆฌํฐ๋ด vs ์์ฑ์ ํจ์)
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ์์ ์ ์์ฑํ ์์ฑ์ ํจ์์ prototype ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ฅผ ์์ ์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ก ์ค์ ํ๋ค.- ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์์์ ์์ฑ์ ํจ์ : Object()
- ์์ฑ์ ํจ์ ๋ฐฉ์์์ ์์ฑ์ ํจ์ : Person() (์์ ์์ฒด)
์ ๋ฌธ๊ฐ๋ค์ ์ผ๋ฐ ํจ์์ ์์ฑ์ ํจ์์ ๊ตฌ๋ถ์ด ์์ผ๋ฏ๋ก ์์ฑ์ ํจ์๋ก ์ฌ์ฉํ ํจ์๋ ๋๋ฌธ์๋ก ํ๊ธฐํ๋ ๋ค์ด๋ฐ ๊ท์น์ ๊ถ์ฅํ๊ณ ์๋์ ๊ฐ์ ์ฝ๋ ํจํด์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
function A(arg) { if (!(this instanceof A)) // this๊ฐ A์ instance ์ธ์ง ํ์ธ return new A(arg); this.value = arg ? arg : 0; }
- ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ์ฐจ์ด(๊ฐ์ฒด ๋ฆฌํฐ๋ด vs ์์ฑ์ ํจ์)
-
call๊ณผ apply ๋ฉ์๋๋ฅผ ์ด์ฉํ ๋ช ์์ ์ธ this ๋ฐ์ธ๋ฉ
apply(), call() ๋ฉ์๋๋ ๋ชจ๋ ํจ์์ ๋ถ๋ชจ ๊ฐ์ฒด์ธ Function.prototype ๊ฐ์ฒด์ ๋ฉ์๋์ด๋ฏ๋ก, ๋ค์๊ณผ ๊ฐ์ด ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.function.apply(thisArg, argArray); // ์ธ์๋ฅผ ๋ฐฐ์ด ํํ๋ก ํธ์ถ function.call(thisArg[, arg1[, arg2[, ...]]]); // ์ธ์๋ฅผ ์ด๊ฑฐํ๋ ํํ๋ก ํธ์ถ
์๋ ์ฝ๋๋ ๊ฒฐ๊ตญ
Person('foo', 30, 'man')ํจ์๋ฅผ ํธ์ถํ๋ฉด์ this๋ฅผfoo๊ฐ์ฒด๋ก ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉ ํ๋๊ฒ์ ์๋ฏธํ๋ค.function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; } var foo = {}; Person.apply(foo, ['foo', 30, 'man']); // Person.call(foo, 'foo', 30' man'); // call ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ console.dir(foo); // ๋๋ฒ๊น > Object age: 30 gender: "man" name: "foo" __proto__: Object
apply() ๋ฉ์๋๋ฅผ ํ์ฉํ arguments ๊ฐ์ฒด์ ๋ฐฐ์ด ํ์ค ๋ฉ์๋ slice() ํ์ฉ
function myFunction() { console.dir(arguments); // Array.prototype.slice() ๋ฉ์๋๋ฅผ ํธ์ถํด๋ผ. ์ด๋ this๋ arguments ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉํด๋ผ. var args = Array.prototype.slice.apply(arguments); console.dir(args); // ๋๋ฒ๊น > Arguments[3] 0: 1 1: 2 2: 3 callee: function myFunction() { length: 3 __proto__: Object > Array[3] 0: 1 1: 2 2: 3 length: 3 __proto__: Array[0] }
-
-
ํจ์ ๋ฆฌํด
- ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ํญ์ ๋ฆฌํด๊ฐ์ ๋ฐํํ๋ค. ํนํ, return ๋ฌธ์ ์ฌ์ฉํ์ง ์์๋๋ผ๋ ๋ค์ ๊ท์น์ผ๋ก ํญ์ ๋ฆฌํด๊ฐ์ ์ ๋ฌํ๋ค.
- ์ผ๋ฐ ํจ์๋ ๋ฉ์๋๋ ๋ฆฌํด๊ฐ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ, undefined ๊ฐ์ด ๋ฆฌํด๋๋ค.
- ์์ฑ์ ํจ์์์ ๋ฆฌํด๊ฐ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋ฆฌํด๋๋ค. (๋ถ๋ฆฐ,์ซ์,๋ฌธ์์ด๋ ๋ฌด์ํจ) ๋จ, ๋ช ์์ ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ ๊ฒฝ์ฐ๋ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ํญ์ ๋ฆฌํด๊ฐ์ ๋ฐํํ๋ค. ํนํ, return ๋ฌธ์ ์ฌ์ฉํ์ง ์์๋๋ผ๋ ๋ค์ ๊ท์น์ผ๋ก ํญ์ ๋ฆฌํด๊ฐ์ ์ ๋ฌํ๋ค.