Ð Ñе один ÑпоÑÑб ÑÑвоÑиÑи ÑÑнкÑÑÑ. ÐÑн ÑÑдко викоÑиÑÑовÑÑÑÑÑÑ, але Ð¹Ð¾Ð¼Ñ Ð½ÐµÐ¼Ð°Ñ Ð°Ð»ÑÑеÑнаÑиви.
СинÑакÑиÑ
СинÑакÑÐ¸Ñ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑÑнкÑÑÑ:
let func = new Function ([arg1, arg2, ...argN], functionBody);
ФÑнкÑÑÑ ÑÑвоÑÑÑÑÑÑÑ Ð· аÑгÑменÑами arg1...argN Ñ Ð· даним functionBody.
ÐегÑе зÑозÑмÑÑи, дивлÑÑиÑÑ Ð½Ð° пÑиклад. ÐÑÑ ÑÑнкÑÑÑ Ð· двома аÑгÑменÑами:
let sum = new Function('a', 'b', 'return a + b');
alert( sum(1, 2) ); // 3
Ð Ñе ÑÑнкÑÑÑ Ð±ÐµÐ· аÑгÑменÑÑв, лиÑе з ÑÑлом ÑÑнкÑÑÑ:
let sayHi = new Function('alert("ÐÑивÑÑ")');
sayHi(); // ÐÑивÑÑ
ÐÑновна вÑдмÑннÑÑÑÑ Ð²Ñд ÑнÑÐ¸Ñ ÑпоÑобÑв, ÑÐºÑ Ð¼Ð¸ баÑили, полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо ÑÑнкÑÑÑ Ð±ÑквалÑно ÑÑвоÑÑÑÑÑÑÑ Ð· ÑÑдка, Ñкий пеÑедаÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ.
ÐÑÑ Ð¿Ð¾Ð¿ÐµÑÐµÐ´Ð½Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ð»Ð¸ вÑд наÑ, пÑогÑамÑÑÑÑв, напиÑаÑи код ÑÑнкÑÑÑ Ñ ÑкÑипÑÑ.
Ðле new Function дозволÑÑ Ð¿ÐµÑеÑвоÑиÑи бÑдÑ-Ñкий ÑÑдок Ñ ÑÑнкÑÑÑ. ÐапÑиклад, ми можемо оÑÑимаÑи Ð½Ð¾Ð²Ñ ÑÑнкÑÑÑ Ð· ÑеÑвеÑа, а поÑÑм виконаÑи ÑÑ:
let str = ... код, Ñкий оÑÑиманий вÑд ÑеÑвеÑа динамÑÑно ...
let func = new Function(str);
func();
Це викоÑиÑÑовÑÑÑÑÑÑ Ð² дÑже ÑпеÑиÑÑÑÐ½Ð¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ , до пÑÐ¸ÐºÐ»Ð°Ð´Ñ ÐºÐ¾Ð»Ð¸ ми оÑÑимÑÑмо код з ÑеÑвеÑа, або Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼ÑÑÐ½Ð¾Ñ ÐºÐ¾Ð¼Ð¿ÑлÑÑÑÑ ÑÑнкÑÑÑ Ð· ÑаблонÑ, Ñ ÑÐºÐ»Ð°Ð´Ð½Ð¸Ñ Ð²ÐµÐ±Ð´Ð¾Ð´Ð°ÑÐºÐ°Ñ .
ÐамиканнÑ
ÐазвиÑай ÑÑнкÑÑÑ Ð¿Ð°Ð¼âÑÑаÑ, де вона наÑодилаÑÑ Ð² ÑпеÑÑалÑнÑй влаÑÑивоÑÑÑ [[Environment]]. Ðона поÑилаÑÑÑÑÑ Ð½Ð° лекÑиÑне ÑеÑедовиÑе, звÑдки ÑÑнкÑÑÑ Ð±Ñла ÑÑвоÑена (ми ÑозглÑнÑли Ñе в ÑоздÑÐ»Ñ ÐблаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð·Ð¼ÑнноÑ, замиканнÑ).
Ðле коли ÑÑнкÑÑÑ ÑÑвоÑÑÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ new Function, ÑÑ [[Environment]] вÑÑановлÑÑÑÑÑÑ Ñак, Ñоб вказаÑи глобалÑне лекÑиÑне ÑеÑедовиÑе, а не поÑоÑне.
ÐÑже, Ñака ÑÑнкÑÑÑ Ð½Ðµ Ð¼Ð°Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ зовнÑÑнÑÑ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ , ÑÑлÑки до глобалÑÐ½Ð¸Ñ .
function getFunc() {
let value = "ÑеÑÑ";
let func = new Function('alert(value)');
return func;
}
getFunc()(); // Ðомилка: value не визнаÑено
ÐоÑÑвнÑйÑе Ñе Ð·Ñ Ð·Ð²Ð¸ÑÐ°Ð¹Ð½Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÑнкоÑ:
function getFunc() {
let value = "ÑеÑÑ";
let func = function() { alert(value); };
return func;
}
getFunc()(); // "ÑеÑÑ", з лекÑиÑного ÑеÑедовиÑа ÑÑнкÑÑÑ getFunc
Ð¦Ñ Ð¾Ñоблива оÑобливÑÑÑÑ new Function виглÑÐ´Ð°Ñ Ð´Ð¸Ð²Ð½Ð¾, але на пÑакÑиÑÑ Ð²Ð¸ÑвлÑÑÑÑÑÑ Ð´Ñже коÑиÑноÑ.
УÑвÑÑÑ ÑобÑ, Ñо ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ ÑÑвоÑиÑи ÑÑнкÑÑÑ Ð· ÑÑдка. Ðод ÑÑÑÑ ÑÑнкÑÑÑ Ð½Ðµ вÑдомий пÑд ÑÐ°Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð½Ñ ÑÑенаÑÑÑ (оÑÑ ÑÐ¾Ð¼Ñ Ð¼Ð¸ не викоÑиÑÑовÑÑмо звиÑÐ°Ð¹Ð½Ñ ÑÑнкÑÑÑ), але бÑде вÑдомий в пÑоÑеÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ. Ðи можемо оÑÑимаÑи його з ÑеÑвеÑа або з ÑнÑого джеÑела.
ÐаÑа нова ÑÑнкÑÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° взаÑмодÑÑÑи з оÑновним ÑкÑипÑом.
Що ÑобиÑи, Ñоб вона могла оÑÑимаÑи доÑÑÑп до зовнÑÑнÑÑ Ð·Ð¼ÑÐ½Ð½Ð¸Ñ ?
ÐÑоблема полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо до вÑдпÑавки JavaScript-ÐºÐ¾Ð´Ñ Ð´Ð¾ ÑеÑвеÑа ÑеалÑного ÑобоÑого пÑоÑкÑÑ, вÑн ÑÑиÑкаÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¼ÑнÑÑÑкаÑоÑа â Ñе ÑпеÑÑалÑна пÑогÑама, Ñка ÑÑиÑÐºÐ°Ñ ÐºÐ¾Ð´, видалÑÑÑи додаÑÐºÐ¾Ð²Ñ ÐºÐ¾Ð¼ÐµÐ½ÑаÑÑ, пÑобÑли Ñа, Ñо важливо, пеÑейменовÑÑ Ð»Ð¾ÐºÐ°Ð»ÑÐ½Ñ Ð·Ð¼ÑÐ½Ð½Ñ ÐºÐ¾ÑоÑкими Ñменами.
ÐапÑиклад, ÑкÑо ÑÑнкÑÑÑ Ð¼Ð°Ñ let userName, Ñо мÑнÑÑÑкаÑÐ¾Ñ Ð·Ð°Ð¼ÑнÑÑ Ñей код на let a (або ÑнÑÑ Ð±ÑквÑ, ÑкÑо ÑÑ Ð·Ð°Ð¹Ð½ÑÑа) Ñ ÑобиÑÑ Ñе вÑÑди. Це, Ñк пÑавило, безпеÑна ÑÑÑ, ÑÐ¾Ð¼Ñ Ñо змÑнна локалÑна, нÑÑого поза межами ÑÑнкÑÑÑ Ð½Ðµ може оÑÑимаÑи доÑÑÑп до неÑ. РвÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ, мÑнÑÑÑкаÑÐ¾Ñ Ð·Ð°Ð¼ÑнÑÑ ÐºÐ¾Ð¶Ð½Ðµ згадÑÐ²Ð°Ð½Ð½Ñ Ð¿Ñо ÑÑ Ð·Ð¼ÑннÑ. ÐÑнÑÑÑкаÑоÑи ÑозÑмнÑ, вони аналÑзÑÑÑÑ ÑÑÑÑкÑÑÑÑ ÐºÐ¾Ð´Ñ, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¸ нÑÑого не поÑÑÑÑÑÑÑ. Ðони не пÑоÑÑо здÑйÑнÑÑÑÑ âпÑимÑÑивнийâ поÑÑк-замÑнÑ.
ÐÑже, ÑкÑо 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â¦)