4. ν¨μμ νλ‘ν νμ 체μ΄λ - 2
μ΄ κΈμ κ³ νμ€, μ‘νμ£Ό λμ μΈμ¬μ΄λ μλ°μ€ν¬λ¦½νΈλ₯Όμ°Έμ‘°νμ¬ μμ±ν κΈμ λλ€.
#
ν¨μμ λ€μν νν#
μ½λ°± ν¨μμ½λ°± ν¨μλ κ°λ°μκ° λ¨μ§ ν¨μλ₯Ό λ±λ‘νκΈ°λ§ νκ³ , μ΄λ²€νΈκ° λ°μνκ±°λ νΉμ μμ μ λλ¬νμ λ μμ€ν μμ νΈμΆλλ ν¨μλ₯Ό λ§νλ€. λν νΉμ ν¨μμ μΈμλ‘ λ겨μ , μ½λ λ΄λΆμμ νΈμΆλλ ν¨μ λν μ½λ°± ν¨μκ° λ μ μλ€.
λνμ μΈ μ½λ°± ν¨μμ μ¬μ© μκ° JSμμμ μ΄λ²€νΈ νΈλ€λ¬ μ²λ¦¬μ΄λ€. μΉνμ΄μ§κ° λ‘λλκ±°λ ν€λ³΄λκ° μ λ ₯λλ λ±μ DOM μ΄λ²€νΈκ° λ°μν κ²½μ°, λΈλΌμ°μ λ μ μλ DOM μ΄λ²€νΈμ ν΄λΉνλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ€νμν¨λ€. μ΄λ¬ν μ΄λ²€νΈ νΈλ€λ¬μ μ½λ°± ν¨μκ°λ±λ‘νλ€λ©΄, μ½λ°± ν¨μλ μ΄λ²€νΈκ° λ°μν λλ§λ€ λΈλΌμ°μ μ μν΄ μ€νλκ² λλ€.
<!DOCTYPE html><html> <body> <script> // νμ΄μ§ λ‘λ μ νΈμΆλ μ½λ°± ν¨μ window.onload = function () { alert('This is the callback function.'); }; </script> </body></html>
#
μ¦μ μ€ν ν¨μν¨μλ₯Ό μ μν¨κ³Ό λμμ λ°λ‘ μ€ννλ ν¨μλ₯Ό μ¦μ μ€ν ν¨μλΌ νλ€.
(function (name) { console.log('This is the immediate function -->' + name);})('foo');
[μ€ν κ²°κ³Ό]
This is the immediate function --> foo
μ¦μ μ€ν ν¨μλ ν¨μ 리ν°λ΄μ κ΄νΈ ()
λ‘ κ°μΌλ€. κ·Έλ° λ€μ ν¨μκ° λ°λ‘ νΈμΆλ μ μλλ‘ ()
κ΄νΈ μμ μΆκ°νλ€. μ΄ λ κ΄νΈ μμ κ°μ μΆκ°ν΄ μΈμλ₯Ό λ겨μ€μμλ€.
μ΄λ κ² μ¦μ μ€ν ν¨μλ₯Ό λ§λ€λ©΄, μ΄νμ κ°μ ν¨μλ₯Ό λ€μ νΈμΆν μ μλ€. μ΅μ΄νλ²μ μ€νλ§μ νμλ‘ νλ μ΄κΈ°ν μ½λ λΆλΆμ μ¬μ©ν μ μλ€.
jQueryμ κ°μ μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬λ νλ μμν¬ μμ€λ₯Ό μ΄ν΄λ³΄λ©΄, μ¦μ μ€ν ν¨μ ννλ‘ κ΅¬μ±λμ΄ μλλ° μ΄λ μλ°μ€ν¬λ¦½νΈμ λ³μ μ ν¨ λ²μ νΉμ± λλ¬Έμ΄λ€.
μλ°μ€ν¬λ¦½νΈμμλ ν¨μ μ ν¨ λ²μλ₯Ό μ§μνλ€. κΈ°λ³Έμ μΌλ‘ μλ°μ€ν¬λ¦½νΈλ λ³μλ₯Ό μ μΈν λ μ μ μ ν¨ λ²μλ₯Ό κ°μ§μ§λ§, ν¨μ λ΄λΆμμ μ μλ 맀κ°λ³μμ λ³μλ€μν¨μ μ½λ λ΄λΆμμλ§ μ ν¨νλ€. (ν¨μ λ΄μ λ³μλ var
λ₯Ό μ¬μ©ν΄μΌ μ μ μ ν¨ λ²μλ₯Ό κ°μ§ μλλ€.) μ΄κ²μ λ¬λ¦¬ λ§νλ©΄ ν¨μ μΈλΆμ μ½λμμ ν¨μ λ΄λΆμ λ³μλ₯Ό μ‘μΈμ€νλ κ² λΆκ°λ₯ νλ€λ λ»μ΄λ€.
λ°λΌμ λΌμ΄λΈλ¬λ¦¬ μ½λλ₯Ό μ¦μ μ€ν ν¨μ λ΄λΆμ μ μνλ©΄, λΌμ΄λΈλ¬λ¦¬ λ΄μ λ³μλ€μ ν¨μ μΈλΆμμ μ κ·Όν μ μκ³ , μ μ λ€μμ€νμ΄μ€λ₯Ό λλ½νμ§ μμ λ³μ μ΄λ¦ μΆ©λμ΄ λ°μνμ§ μλλ€.
- ν¨μ λ΄μ
var
λ¬Έμ μ¬μ©ν΄ λ³μ μ΄λ¦μ μ μ©ν κ²½μ°
var num = 10;
function myFunc() { var num = 20;}
myFunc();
console.log(num); // 10
- ν¨μ λ΄μ
var
λ¬Έμ μ¬μ©νμ§ μμ κ²½μ°
var num = 10;
function myFunc() { num = 20;}
myFunc();
console.log(num); // 20
#
λ΄λΆ ν¨μJSμμλ ν¨μ μ½λ λ΄λΆμμ ν¨μ μ μκ° κ°λ₯νλ€. μ΄λ¬ν ν¨μλ₯Ό λ΄λΆ ν¨μ(inner function)μ΄λΌ νλ€.
// parent() ν¨μ μ μfunction parent() { var a = 100; var b = 200;
// child() λ΄λΆ ν¨μ μ μ function child() { var b = 300;
console.log(a); console.log(b); } child();}
parent();child();
[μΆλ ₯ κ²°κ³Ό]
100300Uncaught ReferenceError: child is not defined
λ΄λΆ ν¨μμμλ μμ μ λλ¬μΌ λΆλͺ¨ ν¨μ λ³μμ μ κ·Ό κ°λ₯νλ€. (μ€μ½ν 체μ΄λ )
λ΄λΆ ν¨μλ μΌλ°μ μΌλ‘ μμ μ΄ μ μλ λΆλͺ¨ ν¨μ λ΄λΆμμλ§ νΈμΆμ΄ κ°λ₯νλ€.
κ·Έλ°λ°, λΆλͺ¨ ν¨μμμ λ΄λΆ ν¨μλ₯Ό μΈλΆλ‘ 리ν΄ν κ²½μ°, λΆλͺ¨ ν¨μ λ°μμλ λ΄λΆ ν¨μλ₯Ό νΈμΆνλ κ²μ΄ κ°λ₯νλ€.
function parent() { var a = 100; // child() λ΄λΆ ν¨μ var child = function () { console.log(a); };
// child() ν¨μ λ°ν return child;}
var inner = parent();inner();
[μΆλ ₯ κ²°κ³Ό]
100
μ΄μ κ°μ΄ μ€νμ΄ λλ parent()
μ κ°μ λΆλͺ¨ ν¨μ μ€μ½νμ λ³μλ₯Ό μ°Έμ‘°νλ inner()
μ κ°μ ν¨μλ₯Ό ν΄λ‘μ λΌκ³ νλ€.
#
ν¨μλ₯Ό 리ν΄νλ ν¨μJSμμλ ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘ μΌλ° κ°μ²λΌ ν¨μ μ체λ₯Ό 리ν΄ν μ μλλ°, μ΄λ₯Όν΅ν΄ ν¨μλ₯Ό νΈμΆν¨κ³Ό λμμ λ€λ₯Έ ν¨μλ‘ λ°κΎΈκ±°λ μκΈ° μμ μ μ¬μ μνλ ν¨μλ₯Όκ΅¬νν μ μλ€.
var self = function () { console.log('a'); return function () { console.log('b'); };};self = self(); // aself(); // b
this
#
ν¨μ νΈμΆκ³Ό arguments
κ°μ²΄#
JSμμλ ν¨μλ₯Ό νΈμΆν λ ν¨μ νμμ λ§μΆ° μΈμλ₯Ό λκΈ°μ§ μλλΌλ μλ¬κ° λ°μνμ§ μλλ€.
function func(arg1, arg2) { console.log(arg1, arg2);}
func(); // undefined undefinedfunc(1); // 1 undefinedfunc(1, 2); // 1 2func(1, 2, 3); // 1 2
JSμμλ μ μλ ν¨μ μΈμμ λ€λ₯΄κ² λκΈ°λλΌλ μλ¬κ° λ°μνμ§ μλλ€.
ν¨μμ μΈμλ³΄λ€ μ κ² ν¨μλ₯Ό νΈμΆ νμ κ²½μ°μλ undefined
κ° ν λΉλκ³ , λ§κ² νΈμΆ νμ κ²½μ°μλ 무μλλ€.
μ΄λ¬ν νΉμ± λλ¬Έμ λ°νμ μμ νΈμΆλ μΈμμ κ°μλ₯Ό νμΈνκ³ λμμ λ€λ₯΄κ² ν΄μ€μΌ ν κ²½μ°κ° μλλ°, arguments
κ°μ²΄κ° μ΄λ₯Ό κ°λ₯μΌ νλ€.
JSμμλ ν¨μλ₯Ό νΈμΆν λ μ묡μ μΌλ‘ arguments
κ°μ²΄κ° λ΄λΆλ‘ μ λ¬λλ€.
arguments
κ°μ²΄λ ν¨μλ₯Ό νΈμΆν λ λκΈ΄ μΈμλ€μ΄ λ°°μ΄ ννλ‘ μ μ₯λ κ°μ²΄λ₯Ό μλ―Ένλ€. νΉμ΄ν μ μ μ΄ κ°μ²΄κ° μ μ¬ λ°°μ΄ κ°μ²΄λΌλ μ μ΄λ€.
function add(a, b) { console.dir(arguments); return a + b;}
console.log(add(1)); // NaNconsole.log(add(1, 2)); // 3console.log(add(1, 2, 3)); // 3
length
νλ‘νΌν°κ° μκΈ° λλ¬Έμ λ°°μ΄κ³Ό μ μ¬νκ² λμνμ§λ§, λ°°μ΄ λ©μλλ₯Ό μ¬μ©ν κ²½μ° μλ¬κ° λ°μνλ€.
arguments
κ°μ²΄λ 맀κ°λ³μ κ°μκ° μ ννκ² μ ν΄μ§μ§ μμ ν¨μλ₯Ό ꡬννκ±°λ μ λ¬λ μΈμμ κ°μμ λ€λΌ μλ‘ λ€λ₯Έ μ²λ¦¬λ₯Ό ν΄μ€μΌ νλ ν¨μλ₯Ό κ°λ°νλ λ° μ μ©νκ²μ¬μ©ν μ μλ€.
function sum() { var result = 0;
for (var i = 0; i < arguments.length; i++) { result += arguments[i]; }
return result;}
console.log(sum(1, 2, 3)); // 6console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9)); // 45
this
λ°μΈλ©#
νΈμΆ ν¨ν΄κ³Ό JSμμλ ν¨μλ₯Ό νΈμΆν λ κΈ°μ‘΄ 맀κ°λ³μλ‘ μ λ¬λλ μΈμκ°μ λν΄ arguments
κ°μ²΄ λ° this
μΈμκ° ν¨μ λ΄λΆλ‘ μ묡μ μΌλ‘ μ λ¬λλ€.
JSμ μ¬λ¬ κ°μ§ ν¨μκ° νΈμΆλλ λ°©μ(νΈμΆ ν¨ν΄)μ λ°λΌ this
κ° λ€λ₯Έ κ°μ²΄λ₯Όμ°Έμ‘°νκΈ°( this
λ°μΈλ©) λλ¬Έμ μ΄ν΄νκΈ° μ΄λ ΅λ€.
this
λ°μΈλ©#
κ°μ²΄μ λ©μλλ₯Ό νΈμΆν λ κ°μ²΄μ νλ‘νΌν°κ° ν¨μμΌ κ²½μ° λ©μλλΌκ³ νλ€. λ©μλλ₯Ό νΈμΆν λ λ©μλ λ΄λΆ μ½λμμ μ¬μ©λ this
λ λ©μλλ₯Ό νΈμΆν κ°μ²΄λ‘ λ°μΈλ©λλ€.
var myObject = { name: 'foo', sayName: function () { console.log(this.name); },};
var otherObject = { name: 'bar',};
otherObject.sayName = myObject.sayName;
myObject.sayName(); // foootherObject.sayName(); // bar
μ΄ μμ μμ sayName()
λ©μλμ μ¬μ©λ this
λ μμ μ νΈμΆν κ°μ²΄μ λ°μΈλ©λμ΄, myObject
μμ νΈμΆν κ²½μ°λ foo
, otherObject
μμ νΈμΆν κ²½μ°λ bar
κ° μΆλ ₯λλ€.
this
λ°μΈλ©#
ν¨μλ₯Ό νΈμΆν λ ν¨μλ₯Ό νΈμΆνλ©΄, ν¨μ μ½λ λ΄λΆμμ μ¬μ©λ this
λ μ μ κ°μ²΄μ λ°μΈλ©λλ€. λΈλΌμ°μ μμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ€ννλ κ²½μ° μ μ κ°μ²΄λ window
κ°μ²΄κ° λλ€.
μ¦ μλ°μ€ν¬λ¦½νΈμ λͺ¨λ μ μ λ³μλ μ μ κ°μ²΄( window
)μ νλ‘νΌν°μ΄λ€.
var foo = "I'm foo";
console.log(foo); // I'm fooconsole.log(window.foo); // I'm foo
ν¨μλ₯Ό νΈμΆν λ this
λ°μΈλ©
var test = 'This is test';console.log(window.test);
// sayFoo() ν¨μvar sayFoo = function () { console.log(this.test); // sayFoo() ν¨μ νΈμΆ μ thisλ μ μ κ°μ²΄μ λ°μΈλ©λλ€.};
sayFoo();
μ΄λ κ² ν¨μ νΈμΆμ this
κ° μ μ κ°μ²΄μ λ°μΈλ©λλ κ²μ λ΄λΆ ν¨μλ₯Ό νΈμΆνμ κ²½μ°μλ κ·Έλλ‘ μ μ©λλ―λ‘ μ£Όμν΄μΌ νλ€.
var value = 100;
var myObject = { varlue: 1, func1: function () { this.value += 1; console.log('func1() called. this.value : ' + this.value);
func2 = function () { this.value += 1; console.log('func2 called. this.value : ' + this.value);
func3 = function () { this.value += 1; console.log('func3() called. this.value : ' + this.value); }; func3(); }; func2(); },};myObject.func1();
λ΄λΆ ν¨μ νΈμΆλ ν¨μ νΈμΆλ‘ μ·¨κΈλλ―λ‘ func2()
, func3()
νΈμΆμμ this
λμ μ κ°μ²΄μ λ°μΈλ©λμ΄ window.value
μ 1μ λν κ°μ΄ λμ¨λ€.
[μΆλ ₯ κ²°κ³Ό]
func1() called - this.value : 2func2() called - this.value : 101func3() called - this.value : 102
μ΄λ κ² λ΄λΆ ν¨μκ° this
λ₯Ό μ°Έμ‘°νλ νκ³λ₯Ό 극볡νλ €λ©΄ λΆλͺ¨ ν¨μμ this
λ₯Ό λ΄λΆ ν¨μκ° μ κ·Ό κ°λ₯ν λ€λ₯Έ λ³μμ μ μ₯νλ λ°©λ²μ΄ μ¬μ©λλ€. μ΄λ¬ν κ²½μ° λ³μμμ΄λ¦μ κ΄λ‘μ that
μ΄λΌ νλ€.
var value = 100;
var myObject = { varlue: 1, func1: function () { var that = this;
this.value += 1; console.log('func1() called. this.value : ' + this.value);
func2 = function () { that.value += 1; console.log('func2 called. this.value : ' + that.value);
func3 = function () { that.value += 1; console.log('func3() called. this.value : ' + that.value); }; func3(); }; func2(); },};myObject.func1();
[μΆλ ₯ κ²°κ³Ό]
func1() called - this.value : 2func2() called - this.value : 3func3() called - this.value : 4
this
λ°μΈλ©#
μμ±μ ν¨μλ₯Ό νΈμΆν λ κ°μ²΄ μμ±νλ λ°©λ²μ ν¬κ² λκ°μ§
κ°μ²΄ 리ν°λ΄
μμ±μ ν¨μ : κΈ°μ‘΄ ν¨μμ
new
μ°μ°μλ₯Ό λΆμ¬μ νΈμΆνλ©΄ ν΄λΉ ν¨μκ° μμ±μ ν¨μλ‘ λμ
μΌλ° ν¨μμ
new
λ₯Ό λΆμ¬ νΈμΆνλ©΄ μμΉ μλ μμ±μ ν¨μμ²λΌ λμν μ μμΌλ―λ‘, νΉμ ν¨μκ° μμ±μ ν¨μλΌλ©΄ ν¨μ μ΄λ¦μ 첫 λ¬Έμλ₯Ό λλ¬Έμλ‘ μ°κΈ°λ₯Ό κΆμ₯ .
μμ±μ ν¨μμ λ΄λΆ this
λ λ©μλ, ν¨μ νΈμΆ λ°©μμ this
λ°μΈλ©κ³Ό λ€λ₯΄κ² λμνλ€.
β μμ±μ ν¨μκ° λμνλ λ°©μ
new
μ°μ°μλ‘ μλ°μ€ν¬λ¦½νΈ ν¨μλ₯Ό μμ±μλ‘ νΈμΆνλ©΄ λ€μκ³Ό κ°μ μμλ‘ λμνλ€ .
λΉ κ°μ²΄ μμ± λ°
this
λ°μΈλ©μμ±μ ν¨μ μ½λκ° μ€νλκΈ° μ , λΉ κ°μ²΄κ° μμ±(μμ±μ ν¨μκ° μλ‘ μμ±νλ κ°μ²΄)λκ³ μ΄ κ°μ²΄κ°
this
λ‘ λ°μΈλ©λλ€. μ΄ κ°μ²΄λ μμ μ μμ±ν μμ±μ ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄λ₯Ό μμ μ νλ‘ν νμ κ°μ²΄λ‘μ€μ νλ€.this
λ₯Ό ν΅ν νλ‘νΌν° μμ±μ΄νμλ ν¨μ μ½λ λ΄λΆμ
this
λ₯Ό ν΅ν΄ μμ μμ±λ λΉ κ°μ²΄μ λμ μΌλ‘ νλ‘νΌν°λ λ©μλλ₯Ό μμ±νλ€.μμ±λ κ°μ²΄ 리ν΄μμ±μ ν¨μμμλ 리ν΄λ¬Έμ΄ μλ κ²½μ°
this
λ‘ λ°μΈλ©λ μλ‘μμ±λ κ°μ²΄κ° 리ν΄λλ€. λͺ μμ μΌλ‘this
λ₯Ό 리ν΄ν΄λ κ²°κ³Όλ κ°λ€. (μμ±μν¨μκ° μλλΌλ©΄ 리ν΄κ°μ΄ λͺ μλμ΄ μμ§ μμ κ²½μ°undefined
κ° λ¦¬ν΄λλ€.)
// Person() μμ±μ ν¨μvar Person = function (name) { // ν¨μ μ½λ μ€ν μ this.name = name; // ν¨μ 리ν΄};
// foo κ°μ²΄ μμ±var foo = new Person('foo');console.log(foo.name); // foo
β κ°μ²΄ 리ν°λ΄ λ°©μκ³Ό μμ±μ ν¨μλ₯Ό ν΅ν κ°μ²΄ μμ± λ°©μμ μ°¨μ΄
κ°μ²΄ 리ν°λ΄ λ°©μμ κ°μ ννμ κ°μ²΄λ₯Ό μ¬μμ±ν μ μλ€. μ΄μ λ°ν΄ Person()
μμ±μ ν¨μλ₯Ό μ¬μ©ν΄ κ°μ ννμ λ€λ₯Έ κ°μ²΄λ₯Ό μ¬λ¬κ° μμ±ν μ μλ€.
// κ°μ²΄ 리ν°λ΄ λ°©μμΌλ‘ foo κ°μ²΄ μμ±var foo = { name: 'foo', age: 35, gender: 'man',};console.dir(foo);
// μμ±μ ν¨μfunction Person(name, age, gender, position) { this.name = name; this.age = age; this.gender = gender;}
// Person μμ±μ ν¨μλ₯Ό μ΄μ©ν΄ bar κ°μ²΄, baz κ°μ²΄ μμ±var bar = new Person('bar', 33, 'woman');console.dir(bar);
var baz = new Person('baz', 25, 'woman');console.dir(baz);
[μΆλ ₯ κ²°κ³Ό]
β μ± κ³Ό λ€λ₯Έ μΆλ ₯ κ²°κ³Ό
μ± μμλ μμ±μ ν¨μλ‘ μμ±λ κ°μ²΄
bar
,baz
μ__proto__
: PersonμΌλ‘μΆλ ₯λλ κ²μΌλ‘ λμ΄
- νλ‘ν νμ νμΈ κ²°κ³Ό
foo instanceof Person; // falsePerson.prototype.isPrototypeOf(foo); // falseObject.prototype.isPrototypeOf(foo); // true
bar instanceof Person; // truePerson.prototype.isPrototypeOf(bar); // trueObject.prototype.isPrototypeOf(bar); // true
baz instanceof Person; // truePerson.prototype.isPrototypeOf(baz); // trueObject.prototype.isPrototypeOf(baz); // true
β μμ±μ ν¨μλ₯Ό
new
λ₯Ό λΆμ΄μ§ μκ³ νΈμΆν κ²½μ°
κ°μ²΄ μμ±μ λͺ©μ μΌλ‘ μμ±ν μμ±μ ν¨μλ₯Ό new
λ₯Ό λΆμ΄μ§ μκ±°λ, μΌλ° ν¨μλ₯Ό new
λ₯Ό λΆμ¬ νΈμΆν κ²½μ° μ€λ₯κ° λ°μν μ μλ€. ( this
λ°μΈλ© λ°©μμ΄ λ€λ₯΄κΈ°λλ¬Έ)
function Person(name, age, gender, position) { this.name = name; this.age = age; this.gender = gender;}
var qux = Person('qux', 20, 'man');console.log(qux); // undefined
console.log(window.name); // quxconsole.log(window.age); // 20console.log(window.gender); // man
μμ±μ ν¨μ Person( ... )
μ return
μ΄ μκΈ° λλ¬Έμ qux
λ undefined
κ°μΆλ ₯λλ€.
μμ±μ ν¨μλ₯Ό new
ν€μλμμ΄ μΌλ° ν¨μ ννλ‘ νΈμΆνκΈ° λλ¬Έμ this
κ° μ μκ°μ²΄μΈ window
κ°μ²΄λ‘ λ°μΈλ© λλ€.
μ΄λ¬ν μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄ μΌλ°μ μΌλ‘ μμ±μ ν¨μλ‘ μ¬μ©ν ν¨μλ 첫 κΈμλ₯Ό λλ¬Έμλ‘ νκΈ°νλ€. λν μΆκ°μ μΌλ‘ λ€μμ ν¨ν΄μ μ¬μ©νλ κ²λ κ°λ₯νλ€.
function A(arg) { if (!(this instanceof A)) return new A(arg); this.value = arg ? arg : 0;}var a = new A(100);var b = A(10);
console.log(a.value); // 100console.log(b.value); // 10console.log(global.value); // undefined
ν¨μ Aκ° νΈμΆλ λ this
κ° Aμ μΈμ€ν΄μ€κ° μλλΌλ©΄ new
λ‘ νΈμΆλ κ²μ΄ μλμμλ―Ένκ³ μ΄ κ²½μ° new
λ‘ Aλ₯Ό νΈμΆνμ¬ λ°ννκ² νμλ€.
μ΄λ€ μ½λμμλ
if (!(this instanceof arguments.callee))
λ‘ μμ±ν¨μΌλ‘, νΉμ ν¨μ μ΄λ¦κ³Ό μκ΄μμ΄ μ΄ ν¨ν΄μ μ¬μ©νλλ‘ νλ€.
call
κ³Ό apply
λ©μλλ₯Ό μ΄μ©ν λͺ
μμ μΈ this
λ°μΈλ©#
κ°κ°μ μν©μ λ°λΌ this
κ° μλμΌλ‘ λ°μΈλ©λλλ°, μ΄λ¬ν λ΄λΆμ μΈ this
λ°μΈλ© μ΄μΈμλ this
λ₯Ό νΉμ κ°μ²΄μ λͺ
μμ μΌλ‘ λ°μΈλ©μν€λ λ°©λ²λ μλ€. apply()
μ call()
λ©μλλ₯Ό μ¬μ©ν¨μΌλ‘ κ°λ₯νλ€.
μ΄ λ©μλλ€μ λͺ¨λ ν¨μμ λΆλͺ¨ κ°μ²΄μΈ Function.prototype
κ°μ²΄μ λ©μλμ΄λ―λ‘, λͺ¨λ ν¨μλ λ€μκ³Ό κ°μ νμμΌλ‘ apply()
λ©μλλ₯Ό νΈμΆνλ κ²μ΄ κ°λ₯νλ€.
function.apply(thisArg, argArray)
call()
λ©μλλ apply()
λ©μλμ κΈ°λ₯μ΄ κ°κ³ λ¨μ§ λ겨λ°λ μΈμμ νμλ§ λ€λ₯΄λ€.
μ°μ apply()
λ©μλλ₯Ό νΈμΆνλ μ£Όμ²΄κ° ν¨μκ³ , apply()
λ©μλλ this
λ₯Ό νΉμ κ°μ²΄μ λ°μΈλ©ν λΏ λ³Έμ§μ μΈ κΈ°λ₯μ ν¨μ νΈμΆμ΄λΌλ κ²μ΄λ€.
첫 λ²μ§Έ μΈμ thisArg
λ apply()
λ©μλλ₯Ό νΈμΆν ν¨μ λ΄λΆμμ μ¬μ©ν this
μ λ°μΈλ©ν κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. λ λ²μ§Έ argArray
μΈμλ ν¨μλ₯Ό νΈμΆν λ λκΈΈ μΈμλ€μ λ°°μ΄μ κ°λ¦¬ν¨λ€.
// μμ±μ ν¨μfunction Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender;}
// foo λΉ κ°μ²΄ μμ±var foo = {};
// apply() λ©μλ νΈμΆPerson.apply(foo, ['foo', 30, 'man']);console.dir(foo);
[μΆλ ₯ κ²°κ³Ό]
첫 λ²μ§Έ μΈμλ‘ λκΈ΄ foo
κ° Person()
ν¨μμμ this
λ°μΈλ©λλ€. apply()
λ©μλμ λ λ²μ§Έ μΈμλ‘ λκΈ΄ λ°°μ΄ ['foo', 30, 'man']
μ νΈμΆνλ €λ Person()
ν¨μμ μΈμ name
, age
, gender
λ‘ κ°κ° μ λ¬λλ€.
call()
λ©μλλ apply()
μ κΈ°λ₯μ΄ κ°μ§λ§ apply()
μ λ λ²μ§Έ μΈμμμ λ°°μ΄ννλ‘ λκΈ΄ κ²μ κ°κ° νλμ μΈμλ‘ λκΈ΄λ€.
Person.call(foo, 'foo', 30, 'man');
apply()
μ call()
λ©μλμ λνμ μΈ μ©λκ° arguments
κ°μ²΄μ κ°μ μ μ¬ λ°°μ΄ κ°μ²΄μμ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ κ²½μ°μ΄λ€.
function myFunction() { var args = Array.prototype.slice.apply(arguments); console.dir(args);}
myFunction(1, 2, 3);
μ΄ μ½λλ μ΄λ κ² ν΄μλ μ μλ€.
Array.prototype.slice()
λ©μλλ₯Ό νΈμΆν΄λΌ. μ΄ λthis
λarguments
κ°μ²΄λ‘ λ°μΈλ©ν΄λΌ.
#
ν¨μ 리ν΄μλ°μ€ν¬λ¦½νΈ ν¨μλ νμ 리ν΄κ°μ λ°ννλ€. νΉν return
λ¬Έμ μ¬μ©νμ§ μμλλΌλ νμ λ€μμ κ·μΉμΌλ‘ 리ν΄κ°μ μ λ¬νκ²λλ€.
undefined
κ° λ¦¬ν΄λλ€#
κ·μΉ 1) μΌλ° ν¨μλ λ©μλλ 리ν΄κ°μ μ§μ νμ§ μμ κ²½μ° // noReturnFunc() ν¨μvar noReturnFunc = function () { console.log(βThis function has no return statement.β);};
var result = noReturnFunc(); // This function has no return statement.console.log(result); // undefined
#
κ·μΉ 2) μμ±μ ν¨μμμ 리ν΄κ°μ μ§μ νμ§ μμ κ²½μ° μμ±λ κ°μ²΄κ° 리ν΄λλ€μμ±μ ν¨μμμλ μΌλ°μ μΌλ‘ 리ν΄κ°μ μ§μ νμ§ μκ³ , μλ‘ μμ±λ κ°μ²΄κ° 리ν΄λλλ‘ νλ€. κ·Έλ°λ° λ§μ½ this
λ‘ λ°μΈλ©λλ μμ±λ κ°μ²΄κ° μλ λ€λ₯Έ κ°μ²΄λ₯Ό 리ν΄νλ©΄ μ΄λ»κ² λ κ²μΈκ°?
// Person() μμ±μ ν¨μfunction Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender;
// λͺ
μμ μΌλ‘ λ€λ₯Έ κ°μ²΄ λ°ν return {name: 'bar', age: 20, gender: 'woman'};}
var foo = new Person('foo', 30, 'man');console.dir(foo);
[μΆλ ₯ κ²°κ³Ό]
μΆλ ₯ κ²°κ³Όλ₯Ό μ΄ν΄λ³΄λ©΄, μμ±μ ν¨μμ 리ν΄κ°μ κ°μ²΄ 리ν°λ΄ λ°©μμ νΉμ κ°μ²΄λ‘ μ§μ ν κ²½μ° new
μ°μ°μλ‘ Person()
ν¨μλ₯Ό νΈμΆν΄μ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλλΌλ 리ν΄κ°μμ λͺ
μμ μΌλ‘ λκΈ΄ κ°μ²΄λ λ°°μ΄μ΄ 리ν΄λλ€.
νμ§λ§ μμ±μ ν¨μμ 리ν΄κ°μΌλ‘ λκΈ΄ κ°μ΄ κ°μ²΄κ° μλ λ¬Έμμ΄, μ«μ, Booleanμ΄λΌλ©΄ μ΄λ¬ν 리ν΄κ°μ 무μνκ³ this
λ‘ λ°μΈλ©λ κ°μ²΄κ° 리ν΄λλ€.
function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender;
return 100;}
var foo = new Person('foo', 30, 'man');console.log(foo); // Person { name: 'foo', age: 30, gender: 'man' }