ÛÚ© را٠دÛگر Ø¨Ø±Ø§Û Ø³Ø§Ø®Øª ÛÚ© تابع ÙØ¬Ùد دارد. Ø¨Ù ÙØ¯Ø±Øª Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯Ø ا٠ا گاÙÛ Ø§ÙÙØ§Øª را٠دÛÚ¯Ø±Û ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯.
سÛÙØªÚ©Ø³
سÛÙØªÚ©Ø³ Ø¢Ù Ø¨Ø±Ø§Û Ø³Ø§Ø®Øª ÛÚ© تابع Ø¨Ù ØµÙØ±Øª Ø²ÛØ± است:
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]] Ø¨Ù ÛØ§Ø¯ دارد ک٠کجا Ù
تÙÙØ¯ شدÙ. اÛÙ ÙÛÚÚ¯Û Ø¨Ù Ù
ØÛØ· ÙØºÙÛ (lexical environment) از جاÛÛ Ú©Ù Ø³Ø§Ø®ØªÙ Ø´Ø¯Ù Ø§Ø±Ø¬Ø§Ø¹ Ù
ÛâØ¯ÙØ¯ (در اÛÙ Ø¨Ø§Ø±Ù ÙØ¨Ùا در بخش Ù
ØØ¯Ùد٠Ù
ØªØºÛØ±Ø Ú©ÙÙÚÙØ± ØµØØ¨Øª کردÙâØ§ÛÙ
).
اÙ
ا زÙ
اÙÛ Ú©Ù ØªØ§Ø¨Ø¹Û Ø¨Ø§ new Function Ø³Ø§Ø®ØªÙ Ø´ÙØ¯Ø [[Environment]] Ø¢Ù Ù٠ب٠Ù
ØÛØ· ÙØºÙÛ Ø¨Ùک٠ب٠Ù
ØÛØ· Ø³Ø±Ø§Ø³Ø±Û ÛØ§ Ú¯ÙÙØ¨Ø§Ù اشار٠Ù
ÛâØ´ÙØ¯.
در ÙØªÛØ¬ÙØ تابع Ø¨Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ Ø®ÙØ¯Ø´ Ø¯Ø³ØªØ±Ø³Û ÙØ¯Ø§Ø±Ø¯Ø بÙÚ©Ù ÙÙØ· Ø¨Ù Ù ØªØºÛØ±ÙØ§Û Ú¯ÙÙØ¨Ø§ÛÙ Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø±Ø¯.
function getFunc() {
let value = "تست";
let func = new Function('alert(value)');
return func;
}
getFunc()(); // error: value is not defined
اÛ٠را با Ø±ÙØªØ§Ø± Ø¹Ø§Ø¯Û Ù ÙØ§Ûس٠کÙÛØ¯:
function getFunc() {
let value = "تست";
let func = function() { alert(value); };
return func;
}
getFunc()(); // "test", از Ù
ØÛØ· ÙØºÙÛ ØªØ§Ø¨Ø¹ getFunc
اÛÙ ÙØ§Ø¨ÙÛØª ÙÛÚÙâÛ new Function Ø¹Ø¬ÛØ¨ Ø¨Ù ÙØ¸Ø± Ù
ÛâØ±Ø³Ø¯Ø Ø§Ù
ا در عÙ
Ù Ø¨Ø³ÛØ§Ø± کارا است.
ØªØµÙØ± Ú©ÙÛØ¯ ک٠٠ا Ù Ø¬Ø¨ÙØ± ÙØ³ØªÛÙ ØªØ§Ø¨Ø¹Û Ø§Ø² ÛÚ© رشت٠بسازÛÙ . کد آ٠تابع در ز٠ا٠ÙÙØ´ØªÙ کد ٠عÙÙÙ ÙÛØ³Øª (ب٠ÙÙ Û٠دÙÛ٠است در اÛÙ Ù ÙÙØ¹Ûت از تابع ٠ع٠ÙÙÛ Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâÚ©ÙÛÙ ) Ø Ø§Ù Ø§ در ز٠ا٠اجرا کد تابع ٠عÙÙÙ Ø®ÙØ§Ùد شد. Ø´Ø§ÛØ¯ Ø¢ÙØ±Ø§ از Ø³Ø±ÙØ± ÛØ§ ÛÚ© Ù ÙØ¨Ø¹ دÛÚ¯Ø±Û Ø¯Ø±ÛØ§Ùت کردÙâØ§ÛÙ .
تابع Ø¬Ø¯ÛØ¯ ٠ا ÙÛØ§Ø² دارد ک٠با Ú©Ø¯ÙØ§Û Ø³ÙØ¯ اصÙÛ Ù Ø§ تعا٠٠داشت٠باشد.
ا٠ا ÚÙ Ø§ØªÙØ§ÙÛ Ù ÛâØ§ÙØªØ¯ اگر Ø¨Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø
٠شک٠اÛ٠است Ú©Ù ÙØ¨Ù از اÛÙ Ú©Ù Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø¨Ø±Ø§Û Ø§Ø³ØªÙØ§Ø¯Ù Ù ÙØªØ´Ø± Ø´ÙØ¯Ø ØªÙØ³Ø· ÛÚ© minifier â ÛÚ© Ø¨Ø±ÙØ§Ù Ù Ù Ø®ØµÙØµ ک٠کد را با ØØ°Ù Ú©Ø§Ù ÙØªâÙØ§Ø ÙØ§ØµÙÙâگذارÛâÙØ§ Ù â¦ ÙØ´Ø±Ø¯Ù Ù ÛâÚ©ÙØ¯ â ÙØ´Ø±Ø¯Ù Ù ÛâÚ©ÙØ¯. ÚÛØ²Û Ú©Ù Ù Ù٠است اÛ٠است Ú©Ù ÙØ§Ù Ù ØªØºÛØ±ÙØ§Û Ù ØÙÛ Ø¨Ù Ú©Ù٠ات Ú©ÙØªØ§ÙâØªØ±Û ØªØºÛÛØ± دادÙâ Ù ÛâØ´ÙÙØ¯.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ اگر ÛÚ© تابع در بدÙÙâØ§Ø´ شاÙ
Ù let userName Ø¨Ø§Ø´Ø¯Ø Ø¢Ù Ø¨Ø±ÙØ§Ù
Ù Ú©ÙÚÚ©âØ³Ø§Ø² (minifier) Ø¢ÙâØ±Ø§ با ÚÛØ²Û شبÛÙ 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>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)