Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ÛÚ© Ø²Ø¨Ø§Ù Ø¨Ø³ÛØ§Ø± تابعâÙ ØÙر است. اÛ٠زبا٠ب٠٠ا Ø¢Ø²Ø§Ø¯Û Ø²ÛØ§Ø¯Û Ù ÛâØ¯ÙØ¯. ÛÚ© تابع Ù ÛâØªÙØ§Ùد در ÙØ± ÙØØ¸Ù Ø³Ø§Ø®ØªÙ Ø´ÙØ¯Ø ب٠عÙÙØ§Ù آرگÙ٠ا٠ب٠تابع دÛÚ¯Ø±Û Ø¯Ø§Ø¯Ù Ø´ÙØ¯ ٠سپس بعدا در ÛÚ© Ø¬Ø§Û Ú©Ø§Ù ÙØ§ Ù ØªÙØ§Ùت از کد ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙØ¯.
٠ا از ÙØ¨Ù Ù ÛâØ¯Ø§ÙÛÙ Ú©Ù ÛÚ© تابع Ù ÛâØªÙØ§Ùد Ø¨Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±Ù٠از Ø®ÙØ¯Ø´ Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯ (Ù ØªØºÛØ±ÙØ§Û Â«Ø¨ÛØ±ÙÙÛ»).
ا٠ا اگر Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ Ø§Ø² ز٠اÙÛ Ú©Ù ÛÚ© تابع ساخت٠شد تغÛÛØ± Ú©ÙÙØ¯ ÚÙ Ø§ØªÙØ§ÙÛ Ù ÛâØ§ÙØªØ¯Ø Ø¢ÛØ§ تابع Ù ÙØ¯Ø§Ø±ÙØ§Û Ø¬Ø¯ÛØ¯ را Ø¯Ø±ÛØ§Ùت Ù ÛâÚ©ÙØ¯ ÛØ§ ÙØ¯ÛÙ ÛâÙØ§ راØ
٠اگر ÛÚ© تابع ب٠عÙÙØ§Ù ÛÚ© پارا٠تر رد Ù Ø¨Ø¯Ù Ø´ÙØ¯ Ù Ø¬Ø§Û Ø¯ÛÚ¯Ø±Û Ø§Ø² کد ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙØ¯Ø Ø¢ÛØ§ Ø¨Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ Ø¯Ø± Ø¬Ø§Û Ø¬Ø¯ÛØ¯ Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ù ÛâÚ©ÙØ¯Ø
Ø¨ÛØ§ÛÛØ¯ Ø¯Ø§ÙØ´ Ø®ÙØ¯ را گستردÙâØªØ± Ú©ÙÛ٠تا اÛÙ Ø³ÙØ§Ø±ÛÙÙØ§ Ù Ù¾ÛÚÛØ¯ÙâØªØ± از اÛÙÙØ§ را درک Ú©ÙÛÙ .
let/const ØØ±Ù Ù
ÛâØ²ÙÛÙ
در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ 3 Ø±Ø§Ù Ø¨Ø±Ø§Û ØªØ¹Ø±ÛÙ ÛÚ© Ù
ØªØºÛØ± ÙØ¬Ùد دارد: letØ const (اÛÙ Ø¯Ù Ø±ÙØ´ Ù
Ø¯Ø±Ù ÙØ³ØªÙد) Ù var (ک٠از گذشت٠باÙÛ Ù
Ø§ÙØ¯Ù است).
- در اÛÙ Ù
ÙØ§ÙÙ Ù
ا از Ù
ØªØºÛØ±ÙاÛ
letدر ٠ثاÙâÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙÛÙ . - Ù
ØªØºÛØ±ÙاÛÛ Ú©Ù Ø¨Ø§
constتعرÛÙ Ø´ÙÙØ¯Ø Ø±ÙØªØ§Ø± ٠شابÙÛ Ø¯Ø§Ø±ÙØ¯ پس اÛÙ Ù ÙØ§Ù٠دربارÙconstÙÙ ÙØ³Øª. varÙØ¯ÛÙ Û ÚÙØ¯ ØªÙØ§Ùت ÙØ§Ø¨Ù ØªÙØ¬Ù دارد ک٠در Ù ÙØ§ÙÙ âÚ©ÙÙ ÙâÛ "var" ÙØ¯ÛÙ Û Ù¾ÙØ´Ø´ داد٠٠ÛâØ´ÙÙØ¯.
بÙÙÚ©âÙØ§Û کد
اگر ÛÚ© Ù
ØªØºÛØ± درÙ٠بÙÙÚ© کد {...} تعرÛÙ Ø´ÙØ¯Ø ÙÙØ· درÙÙ ÙÙ
ا٠بÙÙÚ© ÙØ§Ø¨Ù رÙÛØª است.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
{
// ÛÚ© کار با Ù
ØªØºÛØ±ÙØ§Û Ù
ØÙÛ Ú©Ù Ø§Ø² Ø¨ÛØ±ÙÙ ÙØ¨Ø§Ûد Ø´ÙØ§Ø®ØªÙ Ø´ÙÙØ¯ Ø§ÙØ¬Ø§Ù
دÙÛØ¯
let message = "Hello"; // ÙÙØ· درÙ٠اÛ٠بÙÙÚ© ÙØ§Ø¨Ù رÙÛØª است
alert(message); // Hello
}
alert(message); // تعرÛÙ ÙØ´Ø¯Ù است message :Ø§Ø±ÙØ±
٠ا Ù ÛâØªÙØ§ÙÛ٠از اÛÙ Ø®Ø§ØµÛØª Ø¨Ø±Ø§Û Ø§ÛØ²ÙÙ٠کرد٠ÛÚ© ÙØ·Ø¹Ù از کد Ú©Ù Ø¯Ø§Ø±Ø§Û Ù ØªØºÛØ±ÙاÛÛ Ø§Ø³Øª Ú©Ù ÙÙØ· ب٠آ٠تعÙÙ Ø¯Ø§Ø±ÙØ¯ ٠کار Ø®ÙØ¯Ø´ را Ø§ÙØ¬Ø§Ù Ù ÛâØ¯ÙØ¯ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ :
{
// ÙÙ
Ø§ÛØ´ Ù¾ÛØ§Ù
let message = "Hello";
alert(message);
}
{
// ÙÙ
Ø§ÛØ´ Ù¾ÛØ§Ù
Û Ø¯Ûگر
let message = "Goodbye";
alert(message);
}
ÙØ·Ùا در ÙØ¸Ø± Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ ک٠بدÙ٠بÙÙÚ©âÙØ§Û جدا اگر Ù
ا از let ÙÙ
را٠با ÛÚ© Ù
ØªØºÛØ± Ù
ÙØ¬Ùد Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø ÛÚ© Ø§Ø±ÙØ± Ø§ÛØ¬Ø§Ø¯ Ø®ÙØ§Ùد شد.
// ÙÙ
Ø§ÛØ´ Ù¾ÛØ§Ù
let message = "Hello";
alert(message);
// ÙÙ
Ø§ÛØ´ Ù¾ÛØ§Ù
Û Ø¯Ûگر
let message = "Goodbye"; // Ø§Ø±ÙØ±: Ù
ØªØºÛØ± از ÙØ¨Ù تعرÛ٠شد٠است
alert(message);
Ø¨Ø±Ø§Û ifØ forØ while ٠بÙÛÙØ Ù
ØªØºÛØ±ÙاÛÛ Ú©Ù Ø¯Ø±ÙÙ {...} تعرÛÙ Ø´Ø¯Ù Ø¨Ø§Ø´ÙØ¯ تÙÙØ§ درÙ٠آÙÙØ§ ÙØ§Ø¨Ù رÙÛØª ÙØ³ØªÙد:
if (true) {
let phrase = "Hello!";
alert(phrase); // Hello!
}
alert(phrase); // !Ø§Ø±ÙØ±Ø ÚÙÛÙ Ù
ØªØºÛØ±Û ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯
اÛÙØ¬Ø§Ø بعد از اÛÙÚ©Ù if تÙ
اÙ
Ù
ÛâØ´ÙØ¯Ø alert Ù
ØªØºÛØ± phrase را ÙÙ
ÛâØ¨ÛÙØ¯ ٠ب٠ÙÙ
Û٠دÙÛÙ Ø§Ø±ÙØ± Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯.
اÛ٠عاÙÛ Ø§Ø³Øª ÚÙ٠ب٠Ù
ا اجاز٠Ù
ÛâØ¯ÙØ¯ Ú©Ù Ù
ØªØºÛØ±ÙاÛÛ Ø¯Ø± Ø³Ø·Ø Ø¨ÙÙÚ© Ù
ØÙÛ Ø¨Ø³Ø§Ø²ÛÙ
ک٠ب٠ÛÚ© شاخ٠if اختصاص Ø¯Ø§Ø±ÙØ¯.
ÙÙ
ÛÙ Ù
ÙØ¶Ùع Ø¨Ø±Ø§Û ØÙÙÙâÙØ§Û for Ù while ÙÙ
صاد٠است:
for (let i = 0; i < 3; i++) {
// ÙØ§Ø¨Ù رÙÛØª است for ÙÙØ· درÙ٠اÛÙ ØÙÙÙ i Ù
ØªØºÛØ±
alert(i); // اÙÙ 0Ø Ø³Ù¾Ø³ 1Ø Ø³Ù¾Ø³ 2
}
alert(i); // Ø§Ø±ÙØ±Ø ÚÙÛÙ Ù
ØªØºÛØ±Û ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯
از ÙØØ§Ø¸ Ø¸Ø§ÙØ±ÛØ let i Ø¨ÛØ±Ù٠از {...} است. اÙ
ا اÛÙØ¬Ø§ ساختار for خاص است: Ù
ØªØºÛØ±Û ک٠درÙÙ Ø¢Ù Ø³Ø§Ø®ØªÙ Ø´ÙØ¯Ø Ø¬Ø²Ø¦Û Ø§Ø² بÙÙÚ© کد ÙØ±Ø¶ Ù
ÛâØ´ÙØ¯.
تابعâÙØ§Û ØªÙØ¯Ø±ØªÙ
Ø¨Ù ØªØ§Ø¨Ø¹Û Ú©Ù Ø¯Ø±Ù٠تابع دÛÚ¯Ø±Û Ø³Ø§Ø®ØªÙ Ø´ÙØ¯ Â«ØªÙØ¯Ø±ØªÙ» Ú¯ÙØªÙ Ù ÛâØ´ÙØ¯.
اÛ٠کار را Ø¨Ù Ø±Ø§ØØªÛ در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù ÛâØªÙØ§Ù Ø§ÙØ¬Ø§Ù داد.
Ù ÛâØªÙØ§ÙÛ٠از Ø¢Ù Ø¨Ø±Ø§Û Ø³Ø§Ø²Ù Ø§ÙØ¯ÙÛ Ú©Ø¯ Ø®ÙØ¯ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ Ø Ù Ø«ÙØ§ اÛÙÚ¯ÙÙÙ:
function sayHiBye(firstName, lastName) {
// تابع Ú©Ù
Ú© Ú©ÙÙØ¯Ù ک٠پاÛÛÙâØªØ± Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙØ¯
function getFullName() {
return firstName + " " + lastName;
}
alert( "Ø³ÙØ§Ù
" + getFullName() );
alert( "Ø®Ø¯Ø§ØØ§Ùظ " + getFullName() );
}
اÛÙØ¬Ø§ تابع ØªÙØ¯Ø±ØªÙ getFullName() Ø¨Ø±Ø§Û Ø±Ø§ØØªÛ Ø§Ø³ØªÙØ§Ø¯Ù شد٠است. اÛ٠تابع Ù
ÛâØªÙØ§Ùد ب٠Ù
ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯ پس Ù
ÛâØªÙØ§Ùد اسÙ
کاÙ
٠را Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯. تابعâÙØ§Û ØªÙØ¯Ø±ØªÙ در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø¨Ø³ÛØ§Ø± Ø±Ø§ÛØ¬ ÙØ³ØªÙد.
ÛÚ© ÚÛØ² Ø¬Ø§ÙØ¨âتر اÛ٠است Ú©Ù ÛÚ© تابع ØªÙØ¯Ø±ØªÙ Ù ÛâØªÙØ§Ùد Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´ÙØ¯: ØØ§Ùا ÛØ§ ب٠عÙÙØ§Ù ÛÚ© ÙÛÚÚ¯Û Ø§Ø² Ø´ÛØ¡Ø§Û Ø¬Ø¯ÛØ¯ ÛØ§ Ø®ÙØ¯Ø´ ب٠عÙÙØ§Ù ÙØªÛØ¬Ù Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´ÙØ¯. بعدا Ù ÛâØªÙØ§Ùد در جاÛÛ Ø¯Ûگر Ù ÙØ±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù ÙØ±Ø§Ø± Ø¨Ú¯ÛØ±Ø¯. Ù ÙÙ ÙÛØ³Øª کجا Ø¨Ø§Ø´Ø¯Ø ÙÙÙØ² ÙÙ Ø¨Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ ÛÚ©Ø³Ø§Ù Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø±Ø¯.
در کد پاÛÛÙØ makeCounter تابع «شÙ
Ø§Ø±ÙØ¯Ù» را Ù
ÛâØ³Ø§Ø²Ø¯ ک٠با ÙØ± بار ÙØ±Ø§Ø®ÙاÙÛ Ø¹Ø¯Ø¯ Ø¨Ø¹Ø¯Û Ø±Ø§ برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯:
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2
Ø¹ÙØ§Ù٠بر اÛÙÚ©Ù Ø³Ø§Ø¯Ù Ø§Ø³ØªØ Ú¯ÙÙÙâÙØ§ÛÛ Ú©Ù ÙØ³Ø¨Øª ب٠آ٠کد Ú©Ù Û ØªØºÛÛØ± کردÙâØ§ÙØ¯ Ù ÙØ§Ø±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù کاربردÛâØ§Û Ø¯Ø§Ø±ÙØ¯Ø Ø¨Ø±Ø§Û Ù Ø«Ø§Ù ÛÚ© Ø³Ø§Ø²ÙØ¯Ù عدد تصادÙÛ ØªØ§ Ø¨Ø±Ø§Û Ø¢Ø²Ù Ø§ÛØ´âÙØ§Û Ø®ÙØ¯Ú©Ø§Ø± Ù ÙØ¯Ø§Ø±ÙØ§Û ØªØµØ§Ø¯ÙÛ ØªÙÙÛØ¯ Ú©ÙØ¯.
اÛÙ ÚÚ¯ÙÙ٠کار Ù ÛâÚ©ÙØ¯Ø اگر ٠ا ÚÙØ¯ Ø´Ù Ø§Ø±ÙØ¯Ù بسازÛÙ Ø Ø¢ÛØ§ Ø¢ÙÙØ§ ٠ستÙÙ Ø®ÙØ§ÙÙØ¯ Ø¨ÙØ¯Ø ÚÙ ÚÛØ²Û در ØØ§Ù رخ داد٠رÙÛ Ù ØªØºÛØ±Ùا استØ
درک ÚÙÛÙ ÚÛØ²ÙاÛÛ Ø¨Ø±Ø§Û Ø¯Ø§ÙØ´ Ú©ÙÛ Ø§Ø² Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù Ø³ÙØ§Ø±ÛÙÙØ§Û Ù¾ÛÚÛØ¯ÙâØªØ± Ø®ÙØ¨ است. پس Ø¨ÛØ§ÛÛØ¯ Ú©Ù Û Ø¹Ù ÛÙâØªØ± Ø´ÙÛÙ .
Ù ØÛØ· ÙØºÙÛ (Lexical Environment)
ØªÙØ¶ÛØØ§Øª ع٠ÛÙ ÙÙÛ Ø±Ø§ ادا٠٠٠ÛâØ®ÙØ§ÙÛØ¯.
ÙØ± ÚÙØ¯Ø± Ú©Ù Ù ÛâØ®ÙØ§Ù٠از Ø¬Ø²Ø¦ÛØ§Øª Ø³Ø·Ø Ù¾Ø§ÛÛÙ Ø²Ø¨Ø§Ù Ø¯ÙØ±Û Ú©ÙÙ Ø ÙØ±Ú¯ÙÙÙ Ø¯Ø±Ú©Û Ø¨Ø¯Ù٠آÙÙØ§ Ú©Ù Ø¨ÙØ¯ دارد ٠کا٠٠ÙÛØ³ØªØ پس Ø¢Ù Ø§Ø¯Ù Ø¨Ø§Ø´ÛØ¯.
Ø¨Ø±Ø§Û ÙØ§Ø¶Ø Ø¨ÙØ¯ÙØ ØªÙØ¶ÛØØ§Øª ب٠ÚÙØ¯ ٠رØÙÙ ØªÙØ³Û٠شدÙâØ§ÙØ¯.
٠رØÙÙ 1. Ù ØªØºÛØ±Ùا
در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ ÙØ± تابع در ØØ§Ù Ø§Ø¬Ø±Ø§Ø Ø¨ÙÙÚ© کد {...} ٠تÙ
اÙ
اسکرÛÙ¾ØªØ ÛÚ© Ø´ÛØ¡ درÙÙÛ (Ù¾ÙÙØ§Ù) اختصاص ÛØ§Ùت٠دارد ک٠ب٠عÙÙØ§Ù Ù
ØÛØ· ÙØºÙÛ Ø´ÙØ§Ø®ØªÙ Ù
ÛâØ´ÙØ¯.
Ø´ÛØ¡ Ù ØÛØ· ÙØºÙÛ Ø´Ø§Ù Ù Ø¯Ù Ø¨Ø®Ø´ است:
- Ø°Ø®Ø§ÛØ± Ù
ØÛØ· (Environment Record) â ÛÚ© Ø´ÛØ¡ ک٠تÙ
اÙ
Ù
ØªØºÛØ±ÙØ§Û Ù
ØÙÛ Ø±Ø§ ب٠عÙÙØ§Ù ÙÛÚÚ¯ÛâÙØ§Û Ø®ÙØ¯ (Ù Ø§Ø·ÙØ§Ø¹Ø§Øª دÛÚ¯Ø±Û Ù
اÙÙØ¯ Ù
ÙØ¯Ø§Ø±
this) Ø°Ø®ÛØ±Ù Ù ÛâÚ©ÙØ¯. - ÛÚ© Ø±Ø¬ÙØ¹ ب٠٠ØÛØ· ÙØºÙÛ Ø¨ÛØ±ÙÙÛ (outer)Ø Ù ØÛØ·Û Ú©Ù Ø¨Ù Ú©Ø¯ Ø¨ÛØ±ÙÙÛ Ø§Ø®ØªØµØ§Øµ دارد.
ÛÚ© «Ù
ØªØºÛØ±Â» ÙÙØ· ÛÚ© ÙÛÚÚ¯Û Ø§Ø² Ø´ÛØ¡ خاص درÙÙÛ Environment Record است. Â«Ø¯Ø±ÛØ§Ùت ÛØ§ تغÛÛØ± ÛÚ© Ù
ØªØºÛØ±Â» ب٠Ù
عÙÛ Â«Ø¯Ø±ÛØ§Ùت ÛØ§ تغÛÛØ± ÛÚ© ÙÛÚÚ¯Û Ø§Ø² Ø¢Ù Ø´ÛØ¡Â» است.
در اÛ٠کد Ø³Ø§Ø¯Ù Ú©Ù ØªØ§Ø¨Ø¹Û ÙØ¯Ø§Ø±Ø¯Ø تÙÙØ§ ÛÚ© Ù ØÛØ· ÙØºÙÛ ÙØ¬Ùد دارد:
اÛÙ Ù٠ا٠٠ØÛØ· ÙØºÙÛ Ú¯ÙÙØ¨Ø§Ù است ک٠ب٠ت٠ا٠کد اختصاص ÛØ§ÙتÙ.
در تصÙÛØ± Ø¨Ø§ÙØ§Ø Ù
ستطÛ٠ب٠Ù
Ø¹ÙØ§Û Ø°Ø®Ø§ÛØ± Ù
ØÛØ· (Ø°Ø®Ø§ÛØ± Ù
ØªØºÛØ±) است Ù Ú©Ù
ا٠ب٠Ù
عÙÛ Ù
رجع Ø¨ÛØ±ÙÙÛ. Ù
ØÛØ· ÙØºÙÛ Ú¯ÙÙØ¨Ø§Ù Ù
رجع Ø¨ÛØ±ÙÙÛ ÙØ¯Ø§Ø±Ø¯ ٠ب٠ÙÙ
Û٠دÙÛ٠است Ú©Ù Ú©Ù
ا٠ب٠null اشار٠Ù
ÛâÚ©ÙØ¯.
ÙÙ Ø§ÙØ·Ùر ک٠کد Ø´Ø±ÙØ¹ ب٠اجرا شد٠٠ÛâÚ©ÙØ¯ ٠ادا٠٠٠ÛâÛØ§Ø¨Ø¯Ø Ù ØÛØ· ÙØºÙÛ ØªØºÛÛØ± Ù ÛâÚ©ÙØ¯.
ÛÚ© کد Ø·ÙÙØ§ÙÛâØªØ± را اÛÙØ¬Ø§ دارÛÙ :
٠ستطÛÙâÙØ§Û س٠ت راست ÙØ´Ø§Ù Ù ÛâØ¯ÙÙØ¯ Ú©Ù Ù ØÛØ· ÙØºÙÛ Ú¯ÙÙØ¨Ø§Ù در ØÛ٠اجرا شد٠ÚÚ¯ÙÙ٠تغÛÛØ± Ù ÛâÚ©ÙØ¯:
- زÙ
اÙÛ Ú©Ù Ø§Ø³Ú©Ø±Ûپت Ø´Ø±ÙØ¹ Ù
ÛâÚ©ÙØ¯Ø Ù
ØÛØ· ÙØºÙÛ Ø§Ø² تÙ
اÙ
Ù
ØªØºÛØ±ÙØ§Û ØªØ¹Ø±Û٠شد٠پر Ù
ÛâØ´ÙØ¯.
- در Ø§Ø¨ØªØ¯Ø§Ø Ø¢ÙÙØ§ در ØØ§Ùت «بدÙÙ Ù
ÙØ¯Ø§Ø± اÙÙÛÙ (Uninitialized)» ÙØ³ØªÙد. اÛÙ ÛÚ© ØØ§Ùت درÙÙÛ Ø®Ø§Øµ است ٠ب٠اÛÙ Ù
عÙÛ Ø§Ø³Øª Ú©Ù Ù
ÙØªÙر دربار٠Ù
ØªØºÛØ± آگا٠است اÙ
ا تا زÙ
اÙÛ Ú©Ù Ø¨Ø§
letتعرÛÙ Ø´ÙØ¯ ÙÙ ÛâØªÙØ§Ù Ø¨Ù Ø¢Ù Ø±Ø¬ÙØ¹ کرد. ØªÙØ±Ûبا ٠اÙÙØ¯ اÛ٠است Ú©Ù Ù ØªØºÛØ± ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯.
- در Ø§Ø¨ØªØ¯Ø§Ø Ø¢ÙÙØ§ در ØØ§Ùت «بدÙÙ Ù
ÙØ¯Ø§Ø± اÙÙÛÙ (Uninitialized)» ÙØ³ØªÙد. اÛÙ ÛÚ© ØØ§Ùت درÙÙÛ Ø®Ø§Øµ است ٠ب٠اÛÙ Ù
عÙÛ Ø§Ø³Øª Ú©Ù Ù
ÙØªÙر دربار٠Ù
ØªØºÛØ± آگا٠است اÙ
ا تا زÙ
اÙÛ Ú©Ù Ø¨Ø§
- تعرÛÙ
let phraseÙÙ Ø§ÛØ§Ù Ù ÛâØ´ÙØ¯. ÙÙÙØ² Ù ÙØ¯Ø§Ø±Ø¯ÙÛ ÙØ´Ø¯Ù Ø§Ø³ØªØ Ù¾Ø³ Ù ÙØ¯Ø§Ø± Ø¢ÙÙØ§undefinedاست. ٠ا Ù ÛâØªÙØ§ÙÛ٠از اÛÙØ¬Ø§ ب٠بعد از Ù ØªØºÛØ± Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ . phraseÛÚ© Ù ÙØ¯Ø§Ø± Ú¯Ø±ÙØªÙ است.phraseÙ ÙØ¯Ø§Ø± را تغÛÛØ± Ù ÛâØ¯ÙØ¯.
تا اÛÙØ¬Ø§ ÙÙ Ù ÚÛØ² Ø³Ø§Ø¯Ù Ø¨ÙØ¸Ø± Ù ÛâØ±Ø³Ø¯ ÙÙØ
- ÛÚ© Ù ØªØºÛØ±Ø ÙÛÚÚ¯Û ÛÚ© Ø´ÛØ¡ خاص درÙÙÛ Ø§Ø³Øª ک٠ب٠بÙÙÚ©/تابع/اسکرÛÙ¾ØªÛ Ú©Ù Ø¯Ø± ØØ§Ù اجرا است اختصاص ÛØ§ÙتÙ.
- کارکرد٠با Ù ØªØºÛØ±Ùا در ÙØ§Ùع کارکرد٠با ÙÛÚÚ¯ÛâÙØ§Û Ø¢Ù Ø´ÛØ¡ است.
«٠ØÛØ· ÙØºÙÛ» ÛÚ© Ø´ÛØ¡ درÙ٠٠شخصات است: اÛÙ Ø´ÛØ¡ ÙÙØ· Â«Ø¨Ù ØµÙØ±Øª ØªØ¦ÙØ±Û» در ٠شخصات Ø²Ø¨Ø§Ù ÙØ¬Ùد دارد تا ÚÚ¯ÙÙÚ¯Û Ú©Ø§Ø±Ú©Ø±Ø¯Ù ÚÛØ²Ùا را ØªÙØµÛÙ Ú©ÙØ¯. ٠ا ÙÙ ÛâØªÙØ§ÙÛ٠اÛÙ Ø´ÛØ¡ را در Ú©Ø¯Ù Ø§Ù Ø¯Ø±ÛØ§Ùت Ú©ÙÛ٠٠آ٠را Ø¨Ù ØµÙØ±Øª ٠ستÙÛÙ Ø¯Ø³ØªÚ©Ø§Ø±Û Ú©ÙÛÙ .
تا Ø¢ÙØ¬Ø§ÛÛ Ú©Ù Ø±ÙØªØ§Ø± ÙØ§Ø¨Ù Ù Ø´Ø§ÙØ¯Ù ÙÙ Ø§ÙØ·Ùر Ú©Ù ØªÙØµÛ٠شد باÙÛ Ø¨Ù Ø§ÙØ¯Ø Ù ÙØªÙØ±ÙØ§Û Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ٠٠ک٠است آ٠را بÙÛÙÙ Ú©ÙÙØ¯ Ù Ø«ÙØ§ Ø¨Ø±Ø§Û ØµØ±ÙÙâØ¬ÙÛÛ Ø¯Ø± Ø§Ø´ØºØ§Ù ØØ§ÙØ¸Ù Ù ØªØºÛØ±ÙاÛÛ Ú©Ù Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâØ´ÙÙØ¯ را ØØ°Ù Ú©ÙÙØ¯ ٠ترÙÙØ¯ÙØ§Û Ø¯Ø±ÙÙÛ Ø¯ÛÚ¯Ø±Û Ø±Ø§ اجرا Ú©ÙÙØ¯.
٠رØÙÙ 2. Function Declaration
ÛÚ© تابع Ù٠٠اÙÙØ¯ ÛÚ© Ù ØªØºÛØ±Ø Ù ÙØ¯Ø§Ø± است.
ØªÙØ§Ùت اÛÙØ¬Ø§Ø³Øª Ú©Ù Function Declaration Ø³Ø±ÛØ¹Ø§ Ø¨Ù Ø·ÙØ± Ú©Ø§Ù Ù Ù ÙØ¯Ø§Ø±Ø¯ÙÛ Ù ÛâØ´ÙÙØ¯.
زÙ
اÙÛ Ú©Ù ÛÚ© Ù
ØÛØ· ÙØºÙÛ Ø³Ø§Ø®ØªÙ Ù
ÛâØ´ÙØ¯Ø ÛÚ© Function Declaration Ø³Ø±ÛØ¹Ø§ ب٠ÛÚ© تابع Ø¢Ù
Ø§Ø¯Ù Ø§Ø³ØªÙØ§Ø¯Ù تبدÛÙ Ù
ÛâØ´ÙØ¯ (Ø¨Ø±Ø®ÙØ§Ù let ک٠تا زÙ
ا٠تعرÛ٠آ٠در کد ØºÛØ± ÙØ§Ø¨Ù Ø§Ø³ØªÙØ§Ø¯Ù است).
ب٠ÙÙ Û٠دÙÛ٠است ک٠از ØªØ§Ø¨Ø¹Û Ú©Ù Ø¨Ù ØµÙØ±Øª Function Declaration تعرÛÙ Ø´Ø¯Ù Ø¨Ø§Ø´Ø¯Ø ØØªÛ ÙØ¨Ù از Ø±Ø³ÛØ¯Ù ب٠تعرÛ٠آ٠٠ÛâØªÙØ§ÙÛÙ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ .
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ ز٠اÙÛ Ú©Ù Ù Ø§ ÛÚ© تابع اضاÙÙ Ù ÛâÚ©ÙÛÙ ÙØ¶Ø¹Ûت اÙÙÛÙ Ù ØÛØ· ÙØºÙÛ Ú¯ÙÙØ¨Ø§Ù اÛÙÚ¯ÙÙ٠است:
Ø·Ø¨ÛØ¹ØªØ§Ø اÛÙ Ø±ÙØªØ§Ø± ÙÙØ· Ø¨Ø±Ø§Û Function Declarations است ÙÙ Ø¨Ø±Ø§Û Ø§Ø¹ÙØ§Ù تابع Expression Ú©Ù Ù
ا ÛÚ© Ù
ØªØºÛØ± را برابر با ÛÚ© تابع ÙØ±Ø§Ø± Ù
ÛâØ¯ÙÛÙ
Ù
اÙÙØ¯ let say = function(name)....
٠رØÙÙ 3. Ù ØÛØ·âÙØ§Û ÙØºÙÛ Ø¯Ø±ÙÙÛ Ù Ø¨ÛØ±ÙÙÛ
ز٠اÙÛ Ú©Ù ÛÚ© تابع اجرا Ù ÛâØ´ÙØ¯Ø در Ø§Ø¨ØªØ¯Ø§Û ÙØ±Ø§Ø®ÙاÙÛØ Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ÛÚ© Ù ØÛØ· ÙØºÙÛ Ø¬Ø¯ÛØ¯ Ø¨Ø±Ø§Û Ø°Ø®ÛØ±Ù Ù ØªØºÛØ±ÙØ§Û Ù ØÙÛ Ù Ù¾Ø§Ø±Ø§Ù ØªØ±ÙØ§Û ÙØ±Ø§Ø®ÙاÙÛ Ø§ÛØ¬Ø§Ø¯ Ù ÛâØ´ÙØ¯.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ø¨Ø±Ø§Û say("John)" اÛÙÚ¯ÙÙÙ Ø¨ÙØ¸Ø± Ù
ÛâØ±Ø³Ø¯ (ÙØ±Ø§ÛÙØ¯ اجرا شد٠در Ø®Ø·Û Ø§Ø³Øª ک٠با Ú©Ù
Ø§Ù ÙØ´Ø§ÙÙ Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ø§Ø³Øª):
در ØÛÙ ÙØ±Ø§Ø®ÙاÙÛ ØªØ§Ø¨Ø¹ ٠ا د٠٠ØÛØ· ÙØºÙÛ Ø¯Ø§Ø±ÛÙ : Ù ØÛØ· درÙÙÛ (Ø¨Ø±Ø§Û ÙØ±Ø§Ø®ÙاÙÛ ØªØ§Ø¨Ø¹) Ù Ù ØÛØ· Ø¨ÛØ±ÙÙÛ (Ú¯ÙÙØ¨Ø§Ù):
- Ù
ØÛØ· ÙØºÙÛ Ø¯Ø±ÙÙÛ Ù
ØªÙØ§Ø¸Ø± با ÙØ±Ø§ÛÙØ¯ Ø§Ø¬Ø±Ø§Û Ú©ÙÙÙÛ
sayاست. اÛÙ Ù ØÛØ· ÛÚ© ÙÛÚÚ¯Û(property) دارد:nameÚ©Ù Ù٠ا٠آرگÙ٠ا٠تابع است. ٠اsay("John")را ÙØ±Ø§Ø®ÙاÙÛ Ú©Ø±Ø¯Û٠پس Ù ÙØ¯Ø§Ø±nameبرابر با"John"Ø®ÙØ§Ùد Ø¨ÙØ¯. - Ù
ØÛØ· ÙØºÙÛ Ø¨ÛØ±ÙÙÛ ÙÙ
ا٠Ù
ØÛØ· ÙØºÙÛ Ú¯ÙÙØ¨Ø§Ù است. اÛÙ Ù
ØÛØ· Ù
ØªØºÛØ±
phraseÙ Ø®ÙØ¯ تابع را شا٠٠٠ÛâØ´ÙØ¯.
Ù
ØÛØ· ÙØºÙÛ Ø¯Ø±ÙÙÛ ÛÚ© Ø±Ø¬ÙØ¹ ب٠Ù
ØÛØ· outer(Ø¨ÛØ±ÙÙÛ) دارد.
ز٠اÙÛ Ú©Ù Ú©Ø¯ Ù ÛâØ®ÙØ§Ùد ب٠ÛÚ© Ù ØªØºÛØ± Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ú©ÙØ¯ â Ø§ÙÙ Ù ØÛØ· ÙØºÙÛ Ø¯Ø±ÙÙÛ Ø¬Ø³ØªØ¬Ù Ù ÛâØ´ÙØ¯Ø سپس Ù ØÛØ· Ø¨ÛØ±ÙÙÛØ سپس Ù ØÛØ· Ø¨ÛØ±ÙÙÛâØªØ± Ù ÙÙ ÛÙØ·Ùر تا Ù ØÛØ· ÙØºÙÛ Ú¯ÙÙØ¨Ø§Ù Ø§Ø¯Ø§Ù Ù Ù¾ÛØ¯Ø§ Ù ÛâÚ©ÙØ¯
اگر Ù
ØªØºÛØ±Û جاÛÛ Ù¾ÛØ¯Ø§ ÙØ´ÙØ¯Ø Ø¯Ø± ØØ§Ùت سختâÚ¯ÛØ±Ø§ÙÙ(strict mode) Ø§Ø±ÙØ± Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯ (بدÙÙ use strictØ Ø¨Ø±Ø§Û Ø³Ø§Ø²Ú¯Ø§Ø±Û Ø¨Ø§ Ú©Ø¯ÙØ§Û ÙØ¯ÛÙ
Û Ø§Ú¯Ø± ÛÚ© Ù
ØªØºÛØ± Ú©Ù Ù
ÙØ¬Ùد ÙÛØ³Øª را Ø¨Ø±Ø§Û Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø ÛÚ© Ù
ØªØºÛØ± Ú¯ÙÙØ¨Ø§Ù Ø¬Ø¯ÛØ¯ ساخت٠Ù
ÛâØ´ÙØ¯).
در اÛÙ Ù Ø«Ø§ÙØ جستج٠اÛÙÚ¯ÙÙÙ Ù¾ÛØ´ Ù ÛâØ±ÙØ¯:
- Ø¨Ø±Ø§Û Ù
ØªØºÛØ±
nameØalertک٠درÙÙsayاست Ø¨ÙØ§ÙاصÙ٠آ٠را در Ù ØÛØ· ÙØºÙÛ Ø¯Ø±ÙÙÛ Ù¾ÛØ¯Ø§ Ù ÛâÚ©ÙØ¯. - زÙ
اÙÛ Ú©Ù Ù
ÛâØ®ÙØ§Ùد بÙ
phraseØ¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ú©ÙØ¯Ø ÙÛÚphraseÙ ØÙÛ Ù ÙØ¬Ùد ÙÛØ³ØªØ پس ب٠٠ØÛØ· ÙØºÙÛ Ø¨ÛØ±ÙÙÛ Ø±Ø¬ÙØ¹ ٠آ٠را Ø¢ÙØ¬Ø§ Ù¾ÛØ¯Ø§ Ù ÛâÚ©ÙØ¯.
٠رØÙÙ 4. Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù ÛÚ© تابع
Ø¨ÛØ§ÛÛØ¯ ب٠Ù
ثا٠makeCounter برگردÛÙ
.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
در Ø§Ø¨ØªØ¯Ø§Û ÙØ± ÙØ±Ø§Ø®ÙاÙÛ makeCounterØ ÛÚ© Ø´ÛØ¡ Ù
ØÛØ· ÙØºÙÛ Ø¬Ø¯ÛØ¯ ساخت٠Ù
ÛâØ´ÙØ¯ تا Ù
ØªØºÛØ±Ùا را Ø¨Ø±Ø§Û Ø§ÛÙ ÙØ±Ø§Ø®ÙاÙÛÙ makeCounter Ø°Ø®ÛØ±Ù Ú©ÙØ¯.
Ø¨ÙØ§Ø¨Ø±Ø§Û٠٠ا د٠٠ØÛØ· ÙØºÙÛ ØªÙØ¯Ø±ØªÙ دارÛÙ Ø Ø¯Ø±Ø³Øª ٠اÙÙØ¯ Ù Ø«Ø§Ù Ø¨Ø§ÙØ§:
ØªÙØ§ÙØªÛ Ú©Ù ÙØ¬Ùد دارد اÛ٠است ک٠در ØÛÙ Ø§Ø¬Ø±Ø§Û makeCounterØ ÛÚ© تابع Ú©ÙÚÚ© ØªÙØ¯Ø±ØªÙ ÙÙØ· ب٠خاطر ÛÚ© خط Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯: return count++. Ù
ا ÙÙÙØ² اÛ٠را اجرا ÙÙ
ÛâÚ©ÙÛÙ
ÙÙØ· Ù
ÛâØ³Ø§Ø²ÛÙ
.
تÙ
اÙ
تابعâÙØ§ Ù
ØÛØ· ÙØºÙÛâØ§Û Ú©Ù Ø¯Ø± آ٠ساخت٠شدÙâØ§ÙØ¯ را Ø¨Ù ÛØ§Ø¯ Ù
ÛâØ³Ù¾Ø§Ø±ÙØ¯. از ÙØØ§Ø¸ ÙÙÛØ ÙÛÚ Ø¬Ø§Ø¯ÙÛÛ Ø§ÛÙØ¬Ø§ ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯: تÙ
اÙ
تابعâÙØ§ ÛÚ© ÙÛÚÚ¯Û Ù¾ÙÙØ§Ù [[Environment]] Ø¯Ø§Ø±ÙØ¯ Ú©Ù ÛÚ© Ø±Ø¬ÙØ¹ ب٠Ù
ØÛØ· ÙØºÙÛâØ§Û Ú©Ù ØªØ§Ø¨Ø¹ در آ٠ساخت٠شد٠است دارد:
Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ counter.[[Environment]] ÛÚ© Ø±Ø¬ÙØ¹ ب٠Ù
ØÛØ· ÙØºÙÛ {count: 0} دارد. اÛÙÚ¯ÙÙ٠است ک٠تابع بدÙÙ ØªÙØ¬Ù ب٠اÛÙک٠کجا ÙØ±Ø§Ø®ÙاÙÛ Ø´Ø¯Ù Ø§Ø³ØªØ Ø¬Ø§ÛÛ Ú©Ù Ø³Ø§Ø®ØªÙ Ø´Ø¯Ù Ø±Ø§ Ø¨Ù ÛØ§Ø¯ Ù
ÛâØ³Ù¾Ø§Ø±Ø¯. Ù
رجع [[Environment]] ÙÙØ· ÛÚ© بار Ù Ø¨Ø±Ø§Û ÙÙ
ÛØ´Ù در زÙ
ا٠ساخت تابع ØªÙØ¸ÛÙ
Ù
ÛâØ´ÙØ¯.
Ø¨Ø¹Ø¯Ø§Ø Ø²Ù
اÙÛ Ú©Ù counter() ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâØ´ÙØ¯Ø ÛÚ© Ù
ØÛØ· ÙØºÙÛ Ø¬Ø¯ÛØ¯ Ø¨Ø±Ø§Û Ø¢Ù ÙØ±Ø§Ø®ÙاÙÛ Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯ Ù Ù
رجع Ù
ØÛØ· ÙØºÙÛ Ø¨ÛØ±ÙÙÛ Ø¢Ù Ø§Ø² counter.[[Environment]] Ú¯Ø±ÙØªÙ Ù
ÛâØ´ÙØ¯:
ØØ§Ùا زÙ
اÙÛ Ú©Ù Ú©Ø¯Ø Ø¯Ø±ÙÙ counter() را Ø¨Ø±Ø§Û Ù
ØªØºÛØ± count جستج٠Ù
ÛâÚ©ÙØ¯Ø ابتدا Ù
ØÛØ· ÙØºÙÛ Ø®ÙØ¯Ø´ را جستج٠Ù
ÛâÚ©ÙØ¯ (ک٠ب٠دÙÛÙ ÙØ¨Ùد Ù
ØªØºÛØ±Û Ù
ØÙÛ Ø®Ø§ÙÛ Ø§Ø³Øª)Ø Ø³Ù¾Ø³ Ù
ØÛØ· ÙØºÙÛÙ ÙØ±Ø§Ø®ÙاÙÛÙ Ø¨ÛØ±ÙÙÛÙ makeCounter() را Ø¬Ø³ØªØ¬Ù Ù Ø¢ÙØ¬Ø§ آ٠را Ù¾ÛØ¯Ø§ Ù
ÛâÚ©ÙØ¯ ٠تغÛÛØ±Ø´ Ù
ÛâØ¯ÙØ¯.
ÛÚ© Ù ØªØºÛØ± در Ù ØÛØ· ÙØºÙÛâØ§Û Ú©Ù ÙØ¬Ùد دارد تغÛÛØ± Ù ÛâÛØ§Ø¨Ø¯.
بعد از اجرا Ø´Ø¯Ù ÙØ¶Ø¹Ûت اÛÙÚ¯ÙÙ٠است:
اگر Ù
ا counter() را ÚÙØ¯ بار ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÛÙ
Ø Ù
ØªØºÛØ± count ب٠2Ø 3 Ù Ø¨ÛØ´ØªØ± در Ø¬Ø§Û ÛکساÙÛ Ø§ÙØ²Ø§ÛØ´ Ù
ÛâÛØ§Ø¨Ø¯.
ÛÚ© عبارت Ú©ÙÛ Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û Ø¨Ù ÙØ§Ù âÚ©ÙÙÚØ±â ÙØ¬Ùد دارد Ú©Ù Ø¨Ù Ø·ÙØ± Ú©ÙÛ ØªÙØ³Ø¹ÙâØ¯ÙÙØ¯Ú¯Ø§Ù Ø¨Ø§ÛØ¯ دربار٠آ٠بداÙÙØ¯.
ÛÚ© Ú©ÙÙÚØ± ØªØ§Ø¨Ø¹Û Ø§Ø³Øª Ú©Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±Ù٠از Ø®ÙØ¯Ø´ را Ø¨Ù ÛØ§Ø¯ دارد Ù Ù ÛâØªÙØ§Ùد ب٠آÙÙØ§ Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ú©ÙØ¯. در Ø¨Ø¹Ø¶Û Ø§Ø² زباÙâÙØ§Ø اÛÙ Ù ÙØ¶Ùع ٠٠ک٠است ÛØ§ Ø¨Ø§ÛØ¯ ÛÚ© تابع ب٠گÙÙÙâØ§Û ÙÙØ´ØªÙ Ø´ÙØ¯ ک٠اÛ٠کار را Ø§ÙØ¬Ø§Ù Ø¯ÙØ¯. ا٠ا ÙÙ Ø§ÙØ·Ùر ک٠در Ø¨Ø§ÙØ§ ØªÙØ¶ÛØ Ø¯Ø§Ø¯Ù Ø´Ø¯Ø Ø¯Ø± Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ ØªÙ Ø§Ù ØªØ§Ø¨Ø¹âÙØ§ Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹Û Ú©ÙÙÚØ± ÙØ³ØªÙد (تÙÙØ§ ÛÚ© Ø§Ø³ØªØ«ÙØ§ ÙØ¬Ùد دارد ک٠در سÛÙØªÚ©Ø³ "new Function" Ù¾ÙØ´Ø´ Ù ÛâØ¯ÙÛÙ ).
اÛÙ ÛØ¹ÙÛ Ø§ÛÙÚ©Ù: Ø¢ÙÙØ§ Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± جاÛÛ Ú©Ù Ø³Ø§Ø®ØªÙ Ø´Ø¯ÙâØ§ÙØ¯ را با Ø§Ø³ØªÙØ§Ø¯Ù از ÙÛÚÚ¯Û Ù¾ÙÙØ§Ù [[Environment]] Ø¨Ù ÛØ§Ø¯ Ù
ÛâØ³Ù¾Ø§Ø±ÙØ¯ ٠سپس کد Ø¢ÙÙØ§ Ù
ÛâØªÙØ§Ùد ب٠Ù
ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ú©ÙØ¯.
زÙ
اÙÛ Ú©Ù Ø¯Ø± Ù
ØµØ§ØØ¨Ù Ú©Ø§Ø±Û ÙØ³ØªÛد Ù ÛÚ© ØªÙØ³Ø¹ÙâØ¯ÙÙØ¯Ù ÙØ±Ø§ÙØªâØ§ÙØ¯ Ø³ÙØ§ÙÛ Ø¯Ø±Ø¨Ø§Ø±Ù Ø§ÛÙک٠«کÙÙÚØ± ÚÛØ³ØªØÂ» Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯Ø ب٠عÙÙØ§Ù ÛÚ© پاسخ Ù
عتبر Ù
ÛâØªÙØ§ÙÛØ¯ تعرÛÙ Ú©ÙÙÚØ± Ù ÛÚ© ØªÙØ¶ÛØ Ø¯Ø±Ø¨Ø§Ø±Ù Ø§ÛÙک٠تÙ
اÙ
تابعâÙØ§ در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ú©ÙÙÚØ± ÙØ³ØªÙد را بگÙÛÛØ¯ Ù Ø´Ø§ÛØ¯ ÚÙØ¯ Ú©ÙÙ
٠دربار٠جزÛÛØ§Øª ÙÙÛ: ÙÛÚÚ¯Û [[Environment]] ٠اÛÙÚ©Ù Ù
ØÛØ· ÙØºÙÛ ÚÚ¯ÙÙ٠کار Ù
ÛâÚ©ÙØ¯.
زباÙÙâØ±ÙØ¨Û
٠ع٠ÙÙØ§ ÛÚ© Ù ØÛØ· ÙØºÙÛ Ø²Ù Ø§ÙÛ Ú©Ù ÙØ±Ø§Ø®ÙاÙÛ ØªØ§Ø¨Ø¹ ت٠ا٠٠ÛâØ´ÙØ¯ با ØªÙ Ø§Ù Ù ØªØºÛØ±ÙØ§Û Ø®ÙØ¯ از ØØ§Ùظ٠پاک Ù ÛâØ´ÙØ¯. ب٠اÛ٠دÙÛÙ Ú©Ù ÙÛÚ Ø±Ø¬ÙØ¹Û Ø¨Ù Ø¢Ù ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯. ٠اÙÙØ¯ ÙØ± Ø´ÛØ¡ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ ÙÙØ· تا ز٠اÙÛ Ú©Ù ÙØ§Ø¨Ù Ø¯Ø³ØªÛØ§Ø¨Û باشد در ØØ§Ùظ٠ÙÚ¯ÙØ¯Ø§Ø±Û Ù ÛâØ´ÙØ¯.
گرÚÙØ اگر ØªØ§Ø¨Ø¹âØ§Û ØªÙØ¯Ø±ØªÙ ÙØ¬Ùد داشت٠باشد ک٠بعد از Ù¾Ø§ÛØ§Ù ÛÚ© تابع ÙÙÙØ² ÙØ§Ø¨Ù دسترس Ø¨Ø§Ø´Ø¯Ø Ù¾Ø³ ÛÚ© ÙÛÚÚ¯Û [[Environment]] دارد ک٠ب٠Ù
ØÛØ· ÙØºÙÛ Ø±Ø¬ÙØ¹ Ù
ÛâÚ©ÙØ¯.
در اÛÙ ØµÙØ±Øª Ù ØÛØ· ÙØºÙÛ ØØªÛ بعد از تک٠Û٠تابع ÙÙÙØ² ÙØ§Ø¨Ù دسترس است پس از بÛÙ ÙÙ ÛâØ±ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // ÛÚ© Ø±Ø¬ÙØ¹ ب٠Ù
ØÛØ· ÙØºÙÛ Ø±Ø§ Ø°Ø®ÛØ±Ù Ù
ÛâÚ©ÙØ¯ g.[[Environment]]
// است f() Ú©Ù ÙÙ
ا٠Ù
ØÛØ· ÙØºÙÛ ÙØ±Ø§Ø®ÙاÙÛ
ÙØ·Ùا در ÙØ¸Ø± Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ ک٠اگر f() ÚÙØ¯ بار ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙØ¯ ٠تابعâÙØ§Û Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯ÙâØ´Ø¯Ù Ø°Ø®ÛØ±Ù Ø´ÙÙØ¯Ø سپس تÙ
اÙ
Ø´ÛØ¡ÙØ§Û Ù
ØÛØ· ÙØºÙÛ Ù
ØªÙØ§Ø¸Ø± ÙÙ
در ØØ§Ùظ٠ÙÚ¯ÙØ¯Ø§Ø±Û Ù
ÛâØ´ÙØ¯. در کد Ø²ÛØ± ÙØ± 3ØªØ§Û Ø¢ÙÙØ§ Ø°Ø®ÛØ±Ù Ù
ÛâØ´ÙØ¯:
function f() {
let value = Math.random();
return function() { alert(value); };
}
// در آراÛÙ 3 تابع ÙØ¬Ùد Ø¯Ø§Ø±Ø¯Ø ÙØ± کداÙ
ب٠Ù
ØÛØ· ÙØºÙÛ Ù
ØªØµÙ ÙØ³ØªÙد
// f() Ù
ØÛØ·Û Ø§Ø² ÙØ±Ø§Ø®ÙاÙÛ Ù
ØªÙØ§Ø¸Ø±
let arr = [f(), f(), f()];
ÛÚ© Ø´ÛØ¡ Ù ØÛØ· ÙØºÙÛ Ø²Ù Ø§ÙÛ Ú©Ù ØºÛØ± ÙØ§Ø¨Ù دسترس Ø´ÙØ¯ ازبÛÙ Ù ÛâØ±ÙØ¯ (درست ٠اÙÙØ¯ ÙØ± Ø´ÛØ¡ دÛگرÛ). Ø¨Ù Ø¹Ø¨Ø§Ø±ØªÛ Ø¯ÛÚ¯Ø±Ø ÙÙØ· تا ز٠اÙÛ Ú©Ù ØØ¯Ø§ÙÙ ÛÚ© تابع ØªÙØ¯Ø±ØªÙ ÙØ¬Ùد داشت٠باشد Ú©Ù Ø¨Ù Ø¢Ù Ø±Ø¬ÙØ¹ Ú©ÙØ¯ ÙØ¬Ùد Ø®ÙØ§Ùد داشت.
در کد Ø²ÛØ±Ø بعد از اÛÙک٠تابع ØªÙØ¯Ø±ØªÙ ØØ°Ù Ø´ÙØ¯Ø Ù
ØÛØ· ÙØºÙÛ Ø¶Ù
ÛÙ
٠شد٠ب٠آ٠(٠از اÛ٠ر٠value) از ØØ§Ùظ٠پاک Ù
ÛâØ´ÙØ¯:
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // در ØØ§Ùظ٠Ù
ÛâÙ
Ø§ÙØ¯ value ÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ù
ØªØºÛØ± g تا زÙ
اÙÛ Ú©Ù ØªØ§Ø¨Ø¹
g = null; // Ù ØØ§Ùا ØØ§Ùظ٠تÙ
ÛØ² شدÙ...
بÙÛÙÙâØ³Ø§Ø²Û Ø¯Ø± ÙØ§ÙØ¹ÛØª
ÙÙ Ø§ÙØ·Ùر Ú©Ù Ø¯ÛØ¯ÛÙ Ø Ø§Ø² ÙØØ§Ø¸ ØªØ¦ÙØ±Û تا ز٠اÙÛ Ú©Ù ÛÚ© تابع Ù ÙØ¬Ùد Ø§Ø³ØªØ ØªÙ Ø§Ù Ù ØªØºÛØ±ÙØ§Û Ø¨ÛØ±ÙÙÛ ÙÙ ØÙظ Ù ÛâØ´ÙÙØ¯.
ا٠ا در Ø¹Ù ÙØ Ù ÙØªÙØ±ÙØ§Û Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø³Ø¹Û Ù ÛâÚ©ÙÙØ¯ ک٠آ٠را بÙÛÙÙ Ú©ÙÙØ¯. Ø¢ÙÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù از Ù ØªØºÛØ± را Ø¢ÙØ§ÙÛØ² Ù ÛâÚ©ÙÙØ¯ ٠اگر از کد ٠عÙÙ٠باشد Ú©Ù ÛÚ© Ù ØªØºÛØ± Ø¨ÛØ±ÙÙÛ Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâØ´ÙØ¯Ø آ٠را ØØ°Ù Ù ÛâÚ©ÙÙØ¯.
ÛÚ© Ø¹Ø§Ø±Ø¶Ù Ø¬Ø§ÙØ¨Û در Ù ÙØªÙر V8 (ChromeØ EdgeØ Opera) اÛ٠است Ú©Ù ÚÙÛÙ Ù ØªØºÛØ±ÙاÛÛ Ø¯Ø± Ø¯ÛØ¨Ø§Ú¯ Ú©Ø±Ø¯Ù ØºÛØ± ÙØ§Ø¨Ù دسترس Ù ÛâØ´ÙÙØ¯.
Ø³Ø¹Û Ú©ÙÛØ¯ ک٠٠ثا٠پاÛÛ٠را در Chrome بعد از بازکرد٠Developer Tools اجرا Ú©ÙÛØ¯.
زÙ
اÙÛ Ú©Ù Ù
تÙÙÙ Ù
ÛâØ´ÙØ¯Ø در Ú©ÙØ³ÙÙ alert(value) را تاÛÙ¾ Ú©ÙÛØ¯.
function f() {
let value = Math.random();
function g() {
debugger; // Ø ÚÙÛÙ Ù
ØªØºÛØ±Û ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯alert(value) :در Ú©ÙØ³Ù٠تاÛÙ¾ Ú©ÙÛØ¯
}
return g;
}
let g = f();
g();
ÙÙ Ø§ÙØ·Ùر Ú©Ù Ø¯ÛØ¯ÛØ¯Ø ÚÙÛÙ Ù ØªØºÛØ±Û ÙØ¬Ùد ÙØ¯Ø§Ø´Øª! از ÙØØ§Ø¸ ØªØ¦ÙØ±ÛØ Ø¨Ø§ÛØ¯ ÙØ§Ø¨Ù دسترس Ø¨Ø§Ø´Ø¯Ø Ø§Ù Ø§ Ù ÙØªÙر با بÙÛÙÙâØ³Ø§Ø²Û Ø¢Ù Ø±Ø§ ازبÛ٠برد.
اÛÙ Ù ÙØ¶Ùع ٠٠ک٠است Ù ÙØ¬Ø± ب٠٠شکÙâÙØ§Û Ø¬Ø§ÙØ¨ (Ø´Ø§ÛØ¯ ÙÙØªâÚ¯ÛØ±) در Ø²Ù Ø§Ù Ø¯ÛØ¨Ø§Ú¯ Ú©Ø±Ø¯Ù Ø´ÙØ¯. ÛÚ© از Ø¢ÙÙØ§ اÛ٠است ک٠ا٠کا٠دارد ٠ا ÛÚ© Ù ØªØºÛØ± Ú©Ù ÙÙ ÙØ§Ù با Ù ØªØºÛØ± Ù ÙØ±Ø¯ ÙØ¸Ø± ٠ا است را ببÛÙÛÙ :
let value = "سÙÙ¾Ø±Ø§ÛØ²!";
function f() {
let value = "value ÙØ²Ø¯ÛÚ© ترÛÙ Ù
ØªØºÛØ±";
function g() {
debugger; // !Ø Ø³ÙÙ¾Ø±Ø§ÛØ²alert(value) در Ú©ÙØ³ÙÙ: تاÛÙ¾ Ú©ÙÛØ¯
}
return g;
}
let g = f();
g();
Ø®ÙØ¨ است ک٠دربار٠اÛÙ Ø®Ø§ØµÛØª V8 بداÙÛØ¯. اگر در ØØ§Ù Ø¯ÛØ¨Ø§Ú¯ کرد٠با Chrome/Edge/Opera Ø¨Ø§Ø´ÛØ¯Ø Ø¨Ù Ø¯ÛØ± ÛØ§ Ø²ÙØ¯ با Ø¢Ù Ø±ÙØ¨Ø±Ù Ù ÛâØ´ÙÛØ¯.
اÛÙ ÛÚ© باگ در debugger ÙÛØ³Øª بÙÚ©Ù ÛÚ© ÙÛÚÚ¯Û Ø®Ø§Øµ V8 است. Ø´Ø§ÛØ¯ ز٠اÙÛ Ø¢Ù Ø±Ø§ تغÛÛØ± دÙÙØ¯. ش٠ا ÙÙ ÛØ´Ù Ù ÛâØªÙØ§ÙÛØ¯ با Ø§Ø¬Ø±Ø§Û Ù Ø«Ø§ÙâÙØ§Û اÛÙ ØµÙØÙ Ø¢Ù Ø±Ø§ Ø¨Ø±Ø±Ø³Û Ú©ÙÛØ¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)