í¨ì ííìê³¼ í¨ì ì ì¸ë¬¸ ì´ì¸ì í¨ì를 ë§ë¤ ìë ìë ë°©ë²ì´ íë ë ììµëë¤. ì ì¬ì©íë ë°©ë²ì ìëì§ë§, ì´ ë°©ë² ì¸ìë ëìì´ ìì ë ì¬ì©í©ëë¤.
문ë²
new Function 문ë²ì ì¬ì©íë©´ í¨ì를 ë§ë¤ ì ììµëë¤.
let func = new Function ([arg1, arg2, ...argN], functionBody);
ìë¡ ë§ë¤ì´ì§ë í¨ìë ì¸ì arg1...argNê³¼ í¨ì 본문 functionBodyë¡ êµ¬ì±ë©ëë¤.
ì¸ì ë ê°ê° ìë í¨ì를 ì§ì ë§ë¤ì´ ë³´ë©´ì new Function 문ë²ì ëí´ ì´í´í´ë³´ëë¡ í©ìë¤.
let sum = new Function('a', 'b', 'return a + b');
alert( sum(1, 2) ); // 3
ì¸ìê° ìê³ í¨ì ë³¸ë¬¸ë§ ìë í¨ì를 ë§ë¤ì´ë³´ê² ìµëë¤.
let sayHi = new Function('alert("Hello")');
sayHi(); // Hello
기존ì ì¬ì©íë ë°©ë²ê³¼ new Functionì ì¬ì©í´ í¨ì를 ë§ëë ë°©ë²ì ê°ì¥ í° ì°¨ì´ë ë°íìì ë°ì 문ìì´ì ì¬ì©í´ í¨ì를 ë§ë¤ ì ìë¤ë ì ì
ëë¤.
í¨ì ííìê³¼ í¨ì ì ì¸ë¬¸ì ê°ë°ìê° ì§ì ì¤í¬ë¦½í¸ë¥¼ ìì±í´ì¼ë§ í¨ì를 ë§ë¤ ì ììì£ .
ê·¸ë¬ë new Functionì´ë¼ë 문ë²ì ì¬ì©íë©´ ì´ë¤ 문ìì´ë í¨ìë¡ ë°ê¿ ì ììµëë¤. ìë²ìì ì ë¬ë°ì 문ìì´ì ì´ì©í´ ìë¡ì´ í¨ì를 ë§ë¤ê³ ì´ë¥¼ ì¤ííë ê²ë ê°ë¥í©ëë¤.
let str = ... ìë²ìì ëì ì¼ë¡ ì ë¬ë°ì 문ìì´(ì½ë íí) ...
let func = new Function(str);
func();
ìë²ìì ì½ë를 ë°ê±°ë í
í릿ì ì¬ì©í´ í¨ì를 ëì ì¼ë¡ ì»´íì¼í´ì¼ íë ê²½ì°, ë³µì¡í ì¹ ì í리ì¼ì´ì
ì 구íí ëì ê°ì´ ì주 í¹ë³í ê²½ì°ì new Functionì ì¬ì©í ì ììµëë¤.
í´ë¡ì
í¨ìë í¹ë³í íë¡í¼í° [[Environment]]ì ì ì¥ë ì 보를 ì´ì©í´ ì기 ìì ì´ íì´ë ê³³ì 기ìµí©ëë¤. [[Environment]]ë í¨ìê° ë§ë¤ì´ì§ ë ì컬 íê²½ì 참조í©ëë¤(ìì¸í ë´ì©ì ë³ìì ì í¨ë²ìì í´ë¡ì ìì ë¤ë£¨ììµëë¤).
ê·¸ë°ë° new Functionì ì´ì©í´ í¨ì를 ë§ë¤ë©´ í¨ìì [[Environment]] íë¡í¼í°ê° íì¬ ë ì컬 íê²½ì´ ìë ì ì ë ì컬 íê²½ì 참조íê² ë©ëë¤.
ë°ë¼ì new Functionì ì´ì©í´ ë§ë í¨ìë ì¸ë¶ ë³ìì ì ê·¼í ì ìê³ , ì¤ì§ ì ì ë³ììë§ ì ê·¼í ì ììµëë¤.
function getFunc() {
let value = "test";
let func = new Function('alert(value)');
return func;
}
getFunc()(); // ReferenceError: value is not defined
ì¼ë°ì ì¸ ë°©ë²ì ì¬ì©í´ í¨ì를 ì ìí ììì ë¹êµí´ë´ ìë¤.
function getFunc() {
let value = "test";
let func = function() { alert(value); };
return func;
}
getFunc()(); // getFuncì ë ì컬 íê²½ì ìë ê° "test"ê° ì¶ë ¥ë©ëë¤.
ì§ê¸ ë¹ì¥ì new Functionì´ ì ê³µíë í¹ìí 기ë¥ì´ ìµìíì§ ìì ì ìëë°, ì¤ë¬´ìì ì´ ê¸°ë¥ì´ ì주 ì ì©íê² ì°ì
ëë¤.
문ìì´ì ì¬ì©í´ì í¨ì를 ë§ë¤ì´ì¼ íë¤ê³ ê°ì í´ë´ ìë¤. ì¤í¬ë¦½í¸ë¥¼ ìì±íë ìì ì ì´ë»ê² í¨ì를 ì§¤ì§ ì ì ìì´ì 기존ì í¨ì ì ì¸ ë°©ë²ì ì¬ì©íì§ ëª»íëë°, ì¤í¬ë¦½í¸ ì¤í ìì ì¦ìì í¨ì를 ì´ë»ê² ì§ì¼ í ì§ ìì´ëì´ê° ë ì¤ë¥¼ ì ìì ê²ëë¤. ì´ë, ìë²ë¥¼ ë¹ë¡¯í ì¸ë¶ ì¶ì²ë¥¼ íµí´ ì½ë를 ë°ìì¬ ì ìê² ì£ .
ê·¸ë°ë° ì´ë ê² ë§ë¤ì´ì§ ì í¨ìë 기존 ì¤í¬ë¦½í¸ì 문ì ìì´ ìí¸ìì©í ì ìì´ì¼ í©ëë¤.
new Functionì¼ë¡ ë§ë ìë¡ì´ í¨ì ë´ë¶ìì ì¸ë¶ ë³ìì ì ê·¼íë ¤ í ë, 기존 í¨ì ì ì¸ ë°©ìì¼ë¡ ìì±í í¨ìì ëì¼í ëìì´ ë³´ì¥ëì´ì¼ íì£ .
ê·¸ë°ë° ì¤í¬ë¦½í¸ê° íë¡ëì ìë²ì ë°ìë기 ì , ìì¶ê¸°(minifier) ì ìí´ ìì¶ë ë 문ì ê° ë°ìí©ëë¤. ìì¶ê¸°ë ì¤í¬ë¦½í¸ìì 주ìì´ë ì¬ë¶ì 공백 ë±ì ìì ì½ë í¬ê¸°ë¥¼ ì¤ì¬ì£¼ë í¹ìí íë¡ê·¸ë¨ì¸ë° ìì¶ê¸°ê° ì§ì ë³ì ì´ë¦ì ì§§ê² ë°ê¾¸ë©´ì 문ì ê° ë°ìíì£ .
구체ì ì¼ë¡ ì´ë¤ ë¶ë¶ì´ 문ì ê° ëëì§ ìì를 íµí´ ììë´
ìë¤. í¨ì ë´ë¶ì let userNameë¼ë ë³ìê° ìì¼ë©´ ì´ ì§ìë³ìë ìì¶ê¸°ì ìí´ let a ë±(ì§§ì ì´ë¦)ì¼ë¡ ëì²´ëëë°, ì´ë userName 모ëê° aë¡ êµì²´ë©ëë¤. userNameì ì§ìë³ìì´ê³ , í¨ì ì¸ë¶ìì í¨ì ë´ë¶ì ìë ë³ìì ì ê·¼í ì ì기 ë문ì ì´ë ê² í´ë ì í 문ì ê° ìì£ . ìì¶ê¸°ë ë¨ìí ë³ì를 ì°¾ìì ë°ê¾¸ì§ ìê³ ì½ë 구조를 ë¶ìí´ ê¸°ì¡´ì ìì±í ì½ëì 기ë¥ì ë§ê°ë¨ë¦¬ì§ ìì¼ë©´ì ì리íê² ì ìí ì ìíí©ëë¤.
ì´ë° ëì ë°©ì ë문ì new Function 문ë²ì¼ë¡ ë§ë í¨ì ë´ë¶ìì ì¸ë¶ ë³ìì ì ê·¼íë ¤ê³ íë©´ userNameì ì´ë¯¸ ì´ë¦ì´ ë³ê²½ëì기 ë문ì ì°¾ì ì ìê² ë©ëë¤.
ìì¶ê¸°ê° ëìí ì´íì, new Functionì¼ë¡ ë§ë í¨ì ë´ë¶ìì ì¸ë¶ ë ì컬 íê²½ì ì ê·¼íë ¤ê³ í ë 문ì ê° ë°ìí ì ìì£ .
í¨ì ë´ë¶ìì ì¸ë¶ ë³ìì ì ê·¼íë ê²ì ìí¤í ì² ê´ì ììë ì¢ì§ ìê³ ìë¬ì ì·¨ì½í©ëë¤.
new Functionì¼ë¡ ë§ë í¨ìì 무ì¸ê° ëê²¨ì£¼ê³ ì¶ë¤ë©´ ì¸ì를 ì¬ì©íì¸ì.
ìì½
문ë²:
let func = new Function ([arg1, arg2, ...argN], functionBody);
ì¸ì를 í꺼ë²ì 모ì(ì¼íë¡ êµ¬ë¶) ì ë¬í ìë ììµëë¤.
ìë ì¸ ì ì¸ ë°©ìì ëì¼íê² ëìíì£ .
new Function('a', 'b', 'return a + b'); // 기본 문ë²
new Function('a,b', 'return a + b'); // ì¼íë¡ êµ¬ë¶
new Function('a , b', 'return a + b'); // ì¼íì 공백ì¼ë¡ 구ë¶
new Functionì ì´ì©í´ ë§ë í¨ìì [[Environment]]ë ì¸ë¶ ë ì컬 íê²½ì´ ìë ì ì ë ì컬 íê²½ì 참조íë¯ë¡ ì¸ë¶ ë³ì를 ì¬ì©í ì ììµëë¤. ë¨ì ê°ì ë³´ì´ë í¹ì§ì´ê¸´ íì§ë§ ìë¬ë¥¼ ìë°©í´ ì¤ë¤ë ê´ì ìì ì¥ì ì´ ë기ë í©ëë¤. 구조ìì¼ë¡ 매ê°ë³ì를 ì¬ì©í´ ê°ì ë°ë ê² ë ë«ìµëë¤. ìì¶ê¸°ì ìí ìë¬ë ë°©ì§í ì ìì£ .
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.