<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های عارفه حمیدی</title>
        <link>https://virgool.io/feed/@arefe_hamidi</link>
        <description>Developer</description>
        <language>fa</language>
        <pubDate>2026-06-16 19:15:18</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/62978/avatar/avatar.png?height=120&amp;width=120</url>
            <title>عارفه حمیدی</title>
            <link>https://virgool.io/@arefe_hamidi</link>
        </image>

                    <item>
                <title>You Don&#039;t Know JS (Get Started-ch3 - part1)</title>
                <link>https://virgool.io/@arefe_hamidi/you-dont-know-js-get-started-ch3-part1-idnw4ifvqxvu</link>
                <description>Digging to the Roots of JSدر فصل 2 به بررسی ویژگی های زبان js و برخی از الگو ها و رفتارهای زبان در سطح بالا (high level) پرداختیم در این فصل به بررسی برخی از ویژگی های سطح پایین تری (lower-level) از js  میپردازیم . Iterationبرنامه ها اساسا برای پردازش داده ها و تصمیم گیری درباره داده ها ساخته میشن . الگو ها و روش هایی که برای نوشتن برنامه ها استفاده میکنیم تاثیر خیلی زیادی در خوانایی کد داره. الگو های iterator  یک روش استاندارد برای پردازش داده ها هستش. ایده این هستش که منبع داده تکرار بشه یعنی به تدریج پردازش داده انجام بشه و به جای اینکه کل داده یکباره پردازش روش انجام بشه، ابتدا قسمت اول پردازش بشه و سپس بخش بعدی و غیره.ساختار داده ای رو تصور کنید که در  پایگاه داده رابطه ای از کوئری SELECT برای نمایش داده استفاده میکنه ، به طور معمول نتایج به صورت row هایی سازماندهی میشن. اگه تعداد نتایج ما کم باشه میتونیم به طور همزمان کنترل کنیم و عملیات رو انجام بدیم ولی اگه تعداد نتایج ما مثلا 100 یا 1000 یا حتی بیشتر row  باشه چطور ؟؟!  اینجاست که باید از الگوهای تکرار کمک بگیریم و پردازش داده ها رو انجام بدیم.از اونجایی که معمولا ما نمی دونیم تعداد داده ها ما چند تا هستش بنابراین استفاده از الگوهای تکرار تا رسیدن به انتهای مجموعه داده یا رسیدن به شرطی که برای پایان حلقه تکرار میذاریم منطقی تر هستش . از طرفی استفاده از این الگو باعث تمیزتر شدن کد و درک آسان تر کد هم میشه . در ES6 پروتکل خاصی برای الگوهای تکرار به طور مستقیم تعریف شده . پروتکل متد next() رو تعریف میکنه که بعد از هربار فرخوانی iterator  تا زمانی که شرط برقرار باشه نتیجه رو برمیگردونه.Consuming Iteratorsعلاوه بر next()  در ES6 مکانیسم های دیگه ای هم برای انجام عمل تکرار وجود داره. یکی از این مکانیسم ها حلقه for ... of  هستش. به کد زیر توجه کنین :// given an iterator of some data source:
var it = /* .. */;

// loop over its results one at a time
for (let val of it) {
    console.log(`Iterator value: ${ val }`);
}
// Iterator value: ..
// Iterator value: ..
// ..مکانیسم دیگری که برای تکرار استفاده میشه ، عملگر ... هستش. این عملگر دو فرم داره : spread  و rest  که فرم spread  یک  iterator-consumer هستش. برای spread  یک تکرار باید چیزی برای spread وجود داشته باشه. در  js  برای اینکار می تونیم از آرایه ها یا لیست آرگومان ها برای function call  استفاده کنیم.به کد زیر که یک array spread  هست توجه کنین :// spread an iterator into an array,
// with each iterated value occupying
// an array element position.
var vals = [ ...it ];و همچنین به function call spread :// spread an iterator into a function,
// call with each iterated value
// occupying an argument position.
doSomethingUseful( ...it ); در هر دو حالت فرم spread از ... برای تکرار استفاده کرده که مانند همون حلقه for ... of  عمل میکنه.Iterablesپروتکل به طور خودکار یک نمونه تکرار شونده از یک تکرار کننده ایجاد میکنه و ازش استفاده میکنه یعنی یه تکرار میتونه بیشتر از یک بار استفاده شه و هربار یک نمونه تکرار شونده جدید ایجاد و مورد استفاده قرار میگیره.در ES6 ساختار ها و مجموعه داده ها از جمله strings , arrays , maps , sets و موارد دیگر به عنوان iterables تعریف کرده.در نظر بگیرین :// an array is an iterable
var arr = [ 10, 20, 30 ];

for (let val of arr) {
    console.log(`Array value: ${ val }`);
}
// Array value: 10
// Array value: 20
// Array value: 30چون ارایه ها تکرار پذیر هستند میتونیم با استفاده از اپراتور ... spread  کپی کنیم :var arrCopy = [ ...arr ];همچنین میتونیم کاراکتر ها رو به صورت یه رشته تکرار کنیم:var greeting = &amp;quotHello world!&amp;quot
var chars = [ ...greeting ];

chars;
// [ &amp;quotH&amp;quot, &amp;quote&amp;quot, &amp;quotl&amp;quot, &amp;quotl&amp;quot, &amp;quoto&amp;quot, &amp;quot &amp;quot,
//   &amp;quotw&amp;quot, &amp;quoto&amp;quot, &amp;quotr&amp;quot, &amp;quotl&amp;quot, &amp;quotd&amp;quot, &amp;quot!&amp;quot ]یک ساختار داده map  از objects به عنوان key  استفاده میکنه و یک value رو به اون object مرتبط میکنه. map  تکرار متفاوتی با آنچه تا این جا بررسی کردیم داره چون این تکرار فقط از مقادیر نیست و به ورودی ها هم بستگی داره . یک ورودی که یه آرایه 2 بعدی که شامل یک key  و یک  value میشه هستش . به کد زیر توجه کنین :// given two DOM elements, `btn1` and `btn2`

var buttonNames = new Map();
buttonNames.set(btn1,&amp;quotButton 1&amp;quot);
buttonNames.set(btn2,&amp;quotButton 2&amp;quot);

for (let [btn,btnName] of buttonNames) {
    btn.addEventListener(&amp;quotclick&amp;quot,function (){
        console.log(`Clicked ${ btnName }`);
    });
}در حلقه for ... of برای تکرار map  از[btn,btnName] برای تجزیه هر جفت key/value  استفاده میشه.  (btn1 / &quot;Button 1&quot; و btn2 / &quot;Button 2&quot;)و اگه نیاز به index  و value  های یه آرایه در iteration داریم میتونیم از متد entries() استفاده کنیم. به کد زیر توجه کنین:var arr = [ 10, 20, 30 ];

for (let [idx,val] of arr.entries()) {
    console.log(`[${ idx }]: ${ val }`);
}
// [0]: 10
// [1]: 20
// [2]: 30همین طور که دیدین built-in iterables در js  دارای سه شکل iterator  هستند :1- keys-only (keys())2- values-only (values())3- entries (entries())Closureتعریفی که خود کتاب از closure  میگه رو دقیقا براتون میذارم :Closure is when a function remembers and continues to access variables from outside its scope, even when the function is executed in a different scope.اینجا دو ویژگی هستش که اهمیت داره ، اول اینکه closure بخشی از ماهیت یک function  هستش . دوم اینکه برای مشاهده یک closure  باید یه function رو داخل یه scope متفاوت نسبت به جایی که در ابتدا اون function  تعریف شده بود قرار بدین و کد رو اجرا کنین .کد زیر رو در نظر بگیرین:function greeting(msg) {
    return function who(name) {
        console.log(`${ msg }, ${ name }!`);
    };
}

var hello = greeting(&amp;quotHello&amp;quot);
var howdy = greeting(&amp;quotHowdy&amp;quot);

hello(&amp;quotKyle&amp;quot);
// Hello, Kyle!

hello(&amp;quotSarah&amp;quot);
// Hello, Sarah!

howdy(&amp;quotGrant&amp;quot);
// Howdy, Grant!ابتدا یه function  خارجی greeting() داریم که داخلش function who() تعریف شده. function  داخلی امکان دسترسی به variable msg  رو داره . وقتی function  داخلی return میشه reference  داده میشه به hello()  که در خارج از  scope  قرار داره. سپس بار دوم greeting() فراخوانی میشه و یک نمونه function  جدید  ازش ساخته میشه و که بعد از return function  داخلی reference داده میشه به howdy.زمانی که اجرای greeting ()  به پایان رسید تمام مقدار های اون به جز msg  از بین میرن . پس فقط مقدار های hell  و  howdy  و  msg  میمونن که خارج از  scope  بهشون امکان دسترسی وجود داره .هنگام کار با  asynchronous code مثل callback ها Closure  رایج هستش . در نظر بگیرین:function getSomeData(url) {
    ajax(url,function onResponse(resp){
        console.log(
            `Response (from ${ url }): ${ resp }`
        );
    });
}

getSomeData(&amp;quothttps://some.url/wherever&amp;quot);
// Response (from https://some.url/wherever): ...عملگر داخلی onResponse روی url  بسته شده است و تا زمانی که Ajax  فراخوانی بشه و اجرا بشه اون رو حفظ میکنه. حتی اگه getSomeData بلافاصله تموم بشه متغیر پارامتر url  رو تا زمانی که نیاز داره در closure  حفظ میکنه.به نکته ای که باید توجه کرد اینکه همیشه نیاز نیست scope بیرونی یه function  باشه. چیزی که اهمیت داره اینکه در scope  بیرونی حداقل یه variable وجود داره که از یک function  داخلی قابل دسترس هستش. توجه کنین :for (let [idx,btn] of buttons.entries()) {
    btn.addEventListener(&amp;quotclick&amp;quot,function (){
       console.log(`Clicked on button (${ idx })!`);
    });
}چون این loop  داره از let  استفاده میکنه هر تکرار یه idx و  btn  ایجاد میکنه همچنین هربار یک تابع   جدید هم ایجاد میکنه. چون مقدار idx  رو در function  داخلی حفظ میشه تا زمانی که عمل کلیک انجام بشه مقدار index  رو پرینت میکنه.مبحث Closure  یکی از مباحث مهم در الگوهای برنامه نویسی در هر زبانی هستش به همین دلیل برای درک بهتر مفهوم در جلد 2 کتاب ( Scope &amp; Closures) به این مبحث بیشتر پرداخته میشه و مورد بررسی قرار میگیره .در پست بعدی درباره ادامه فصل که مباحث this Keyword و Prototypes رو شامل میشه رو مورد بررسی قرار میدیم.</description>
                <category>عارفه حمیدی</category>
                <author>عارفه حمیدی</author>
                <pubDate>Tue, 17 Mar 2020 21:07:49 +0330</pubDate>
            </item>
                    <item>
                <title>You Don&#039;t Know JS (Get Started-ch2 - part2)</title>
                <link>https://virgool.io/@arefe_hamidi/you-dont-know-js-get-started-ch2-part2-crzaqjzuf4in</link>
                <description>در ادامه طبق روند فصل دوم کتاب جلو میریم و دیگر زمینه های اصلی زبان که باعث میشه بهتر بشناسیمش رو مورد بررسی قرار میدیم .Functionsکلمه function در برنامه نویسی معنی های متنوعی داره. مثلا در دنیای Functional Programming ، شامل مجموعه ای از قوانین هستش که باید رعایت شه. در js ما باید برای function  ها معنی وسیع تری رو در نظر بگیریم که بهش procedure میگن. یک procedure مجموعه ای از عبارات هستش که میتونه یک یا چندبار فراخوانی بشه همچنین ممکنه یک چند ورودی و یا یک یا چند خروجی هم داشته باشه.تعریف function  ها اینطور هستش:function awesomeFunction(coolThings) {
    // ..
    return amazingStuff;
}به این function declaration میگیم . ارتباط بین شناسه awesomeFunction و مقدار function  در مرحله کامپایل کد اتفاق میفته . در مقابل function declaration باید به function expression توجه کنیم که اینطور تعریف میشه:// let awesomeFunction = ..
// const awesomeFunction = ..
var awesomeFunction = function(coolThings) {
    // ..
    return amazingStuff;
};این تابع یک expression  هستش که به متغییر awesomeFunction اختصاص داده شده. برخلاف فرم function declaration در فرم function expression با identifier  تا زمان runtime در ارتباط نیست.ذکر این نکته اهمیت داره که در js توابع مقادیری هستند که میتونن اختصاص داده بشن یعنی توابع js نوعی خاصی از  object value هستند .توابع js میتونن ورودی پارامتر قبول کنند و همچنین باکلمه کلیدی return  مقداری رو برگردونن. به کد زیر توجه کنین :function greeting(myName) {
    return `Hello, ${ myName }!`;
}

var msg = greeting(&amp;quotKyle&amp;quot);

console.log(msg);   // Hello, Kyle! در اینجا myName به عنوان پارامتر ورودی هستش که یک local variable هستش که داخل تابع عمل میکنه. همچنین با استفاده از return  هم میتونیم یه مقدار رو برگردونیم و اگه نیازه مقدار بیشتری برگردونیم میتونیم از array  یا  object  ها استفاده کنیم .همچنین چون function  ها value  هستند بنابراین میتونیم به عنوان properties به object  هم اختصاصشون بدیم . به کد زیر توجه کنین :var whatToSay = {
    greeting() {
        console.log(&amp;quotHello!&amp;quot);
    },
    question() {
        console.log(&amp;quotWhat&#039;s your name?&amp;quot);
    },
    answer() {
        console.log(&amp;quotMy name is Kyle.&amp;quot);
    }
};

whatToSay.greeting();
// Hello!در این کد سه تابع (greeting, question, answer) داریم که به عنوان properties شی whatToSay هستند. Comparisonsتصمیم گیری در برنامه ها نیاز به مقایسه value  ها برای تعیین هویت و رابطه آنها با هم داره. js  چندین مکانیسم برای امکان مقایسه داره، که با هم بررسیشون میکنیم.Equal...ishگاهی اوقات مقایسه برابری قصد تطابق دقیق رو داره اما در بعضی موارد هدف گسترده تر هستش و مقایسه در حد تطابق نزدیک یا مشابه هستش. بنابراین باید به تفاوت بین مقایسه برابری و مقایسه هم ارزی توجه کنیم.حتما در کد js  اپراتور === که بهش &quot;triple-equals&quot; میگن رو دیدین که برای &quot;strict equality&quot; تعریف شده. به این نکته کتاب توجه کنین:&quot;strict&quot; means strict, as in narrow and exact.Not exactly.به مثال های زیر دقت کنید تا بهتر متوجه عملکرد این مقایسه بشین :3 === 3.0;              // true
&amp;quotyes&amp;quot === &amp;quotyes&amp;quot        // true
null === null;          // true
false === false;        // true

42 === &amp;quot42&amp;quot            // false
&amp;quothello&amp;quot === &amp;quotHello&amp;quot    // false
true === 1;             // false
0 === null;             // false
&amp;quot&amp;quot === null;            // false
null === undefined;     // falseهمونطوری که میبنین مقایسه برابری با توجه به مقدار (value) و نوع (type) انجام شده . مثلا در خط 6 مقدار number 6  با مقدار string 6  رو مساوی در نظر نگرفته و مقدار false  رو برگردونده.دو مورد اشتباه هم برای === وجود داره که مقادیر NaN و -0  هستش:NaN === NaN;            // false
0 === -0;               // trueدر مورد مقدار NaN عملگر === به اشتباه میگه که دو مقدار NaN  با هم برابر نیستن همچنین برای مقادیر 0 و -0  ولی  نکته مهمی که وجود داره اینکه از مقدار -0 میتونین تو برنامه هاتون برای اینکه یه مقدار متمایز برای بررسی شرط داشته باشین استفاده کنین.بهتر هستش برای جلوگیری از این اشتباه برای مقایسه NaN  از Number.isNaN(..) و برای مقایسه -0 از Object.is(..) استفاده کنید که مقایسه دقیق تری هستش.اما داستان وقتی پیچیده تر میشه که بخواییم object value  ها رو مقایسه کنیم . توجه کنین :[ 1, 2, 3 ] === [ 1, 2, 3 ];    // false
{ a: 42 } === { a: 42 }         // false
(x =&gt; x * 2) === (x =&gt; x * 2)   // falseدر js  از ===  برای structural equality نمی تونیم استفاده کنیم پس می تونیم نتیجه بگیریم که === برای object  تعریف نشده. ولی میتونیم برای هرobject یه refrence یا value  تعریف کنیم و بهش ارجاع بدیم. کد زیر رو در نظر بگیرین :var x = [ 1, 2, 3 ];

// assignment is by reference-copy, so
// y references the *same* array as x,
// not another copy of it.
var y = x;

y === x;              // true
y === [ 1, 2, 3 ];    // false
x === [ 1, 2, 3 ];    // falseمقایسه مقدار x===y  مقدار true  رو برمیگردونه چون هردو یه مقدار بهشون reference شده اما در دوتا مقایسه بعدی چون بررسی ساختار وجود داره شکست میخوره.Coercive Comparisonsاکثر نوشتار ها و گفتمان ها درباره js  استفاده از == که بهش &quot;loose equality&quot; گفته میشه رو به دلیل طراحی و خطرناک بودنش از نظر رفع اشکال محکوم میکنن. حتی خود Brendan Eich از نحوه طراحی این به عنوان یه اشتباه بزرگ ابراز تاسف میکنه.یک مشکل بزرگی که اکثرا فک میکنن وجود داره این هستش که تصور میکنن == بدون در نظر گرفتن type  مقایسه رو انجام میده در حالی که هر دو اپراتور == و === ابتدا نوع رو بررسی میکنن اما == اجازه میده ابتدا تبدیل نوع انجام بشه و وقتی تبدیل شد و هر دو طرف مقایسه از نظر نوع یکسان شدند سپس همون کاری رو میکنه که === انجام میداد . بهتر اینکه به جای عبارت &quot;loose equality&quot; از عبارت  &quot;coercive equality&quot; استفاده بشه. کد زیر رو در نظر بگیرین:42 == &amp;quot42&amp;quot             // true
1 == true;              // trueهمونطور که توجه کردین == باعث میشه مقدار های غیر عددی &quot;42&quot; و true  ابتدا به مقدار عددی تبدیل بشن و سپس مقایسه انجام بشه و در نتیجه true  بهمون برگردونه.همچنین از مقایسه های رابطه ای مثل &lt; ، &gt; ، =&lt; و =&gt; می تونیم استفاده کنیم. این اپراتور ها هم مثل == اول نوع  رو مقایسه میکنن و در صورت متفاوت بودن اجازه تبدیل نوع معمولا به اعداد رو میدن . توجه کنین :var arr = [ &amp;quot1&amp;quot, &amp;quot10&amp;quot, &amp;quot100&amp;quot, &amp;quot1000&amp;quot ];
for (let i = 0; i &lt; arr.length &amp;&amp; arr[i] &lt; 500; i++) {
    // will run 3 times
}مقایسه این جا اینطور انجام میشه :1 &lt; 500, 10 &lt; 500, 100 &lt; 500, and 1000 &lt; 500بعد از بررسی شرط چهارم false  هستش بنابراین حلقه بعد از شرط سوم متوقف میشه.ذکر این نکته اهمیت داره که در حالتی که یه طرف مقایسه ما عدد باشه نوع طرف دیگه به عدد تبدیل میشه وگرنه در نوع خودش باقی میمونه . توجه کنین :var x = &amp;quot10&amp;quot
var y = &amp;quot9&amp;quot

x &lt; y;      // true, watch out!مقایسه اینجا بین دو str  هستش و بنابراین بر اساس حروف الفبا و ترتیب اعداد باید انجام بشه .How We Organize in JSدو الگوی اصلی سازمندهی کد که بطور گسترده در js استفاده میشه  class ها و  module ها هستن. از بعضی جهات این دو الگو بسیار از هم متفاوت هستن و از بعضی جهات هم فقط طرف های مختلف یک سکه هستن. برای اینکه مهارت بهتری در js بدست بیاریم نیازه که هر دو الگو رو کاملا درک کنیم و بدونیم در کجا نیازه از کدوم الگو استفاده کنیم.Classesکلاس ها چگونگی عملکرد ساختار داده ها رو تعریف میکنن. مکانیسم کلاس ها باعث میشه که داده ها به همراه رفتارها (methods) سازماندهی بشن. نکته قابل اهمیت این هستش که برنامه ای رو که با استفاده از کلاس ها پیاده سازی میشن رو بدون کلاس هم میشه پیاده سازی کرد ولی سازماندهی و خواندن و استدلال کد سخت تر میشه و احتمال وجود اشکال و خطا هم درش بیشتر میشه.کد زیر رو در نظر بگیرین :class Page {
    constructor(text) {
        this.text = text;
    }

    print() {
        console.log(this.text);
    }
}

class Notebook {
    constructor() {
        this.pages = [];
    }

    addPage(text) {
        var page = new Page(text);
        this.pages.push(page);
    }

    print() {
        for (let page of this.pages) {
            page.print();
        }
    }
}

var mathNotes = new Notebook();
mathNotes.addPage(&amp;quotArithmetic: + - * / ...&amp;quot);
mathNotes.addPage(&amp;quotTrigonometry: sin cos tan ...&amp;quot);

mathNotes.print();
// ..در کلاس Page داده ورودی که به عنوان یک property  هستش در  this.text ذخیره شده و متد print() مقدار text  رو در console نشون میده.برای کلاس NoteBook  هم داده ها array  از Page  ها هستند. متد addPage برای هر text  یک new Page  ایجاد میکنه و به ارایه pages  اضافه میکنه. متد print  هم همه صفحات موجود noteBook  رو چاپ میکنه.دستور mathNotes = new Notebook() یه نمونه جدید از کلاس NoteBook ایجاد میکنه و داخل کلاس NoteBook  دستور page = new Page(text) یه نمونه جدید از کلاس Page  رو ایجاد میکنه . متد های یک کلاس هم میتونیم اینطوری فراخوانی کنیم : mathNotes.addPage(..)Class Inheritanceیکی از ویژگی های طراحی &quot;class-oriented&quot; ، وراثت (inheritance) و چند ریختی (polymorphism) هستش .کد زیر رو در نظر بگیرین:class Publication {
    constructor(title,author,pubDate) {
        this.title = title;
        this.author = author;
        this.pubDate = pubDate;
    }

    print() {
        console.log(`
            Title: ${ this.title }
            By: ${ this.author }
            ${ this.pubDate }
        `);
    }
}
class Book extends Publication {
    constructor(bookDetails) {
        super(
            bookDetails.title,
            bookDetails.author,
            bookDetails.publishedOn
        );
        this.publisher = bookDetails.publisher;
        this.ISBN = bookDetails.ISBN;
    }

    print() {
        super.print();
        console.log(`
            Publisher: ${ this.publisher }
            ISBN: ${ this.ISBN }
        `);
    }
}

class BlogPost extends Publication {
    constructor(title,author,pubDate,URL) {
        super(title,author,pubDate);
        this.URL = URL;
    }

    print() {
        super.print();
        console.log(this.URL);
    }
}کلاس Publication مجموعه ای از رفتارهای متداول رو که ممکن هستش یه Publication داشته باشه رو تعریف میکنه . دو کلاس Book  و BlogPost  هر دو extend  شده از کلاس Publication  هستن تا شامل ویژگی های Publication  بشن . هر دو فراخوانی super(...)  در هر constructor به کارهای کلاس پدر خودش میپردازه و سپس کارهای خاص تری رو بنا به نوع خودش انجام میده. به استفاده از کلاس های فرزند توجه کنین :var YDKJS = new Book({
    title: &amp;quotYou Don&#039;t Know JS&amp;quot,
    author: &amp;quotKyle Simpson&amp;quot,
    publishedOn: &amp;quotJune 2014&amp;quot,
    publisher: &amp;quotO&#039;Reilly&amp;quot,
    ISBN: &amp;quot123456-789&amp;quot
});

YDKJS.print();
// Title: You Don&#039;t Know JS
// By: Kyle Simpson
// June 2014
// Publisher: O&#039;Reilly
// ISBN: 123456-789

var forAgainstLet = new BlogPost(
    &amp;quotFor and against let&amp;quot,
    &amp;quotKyle Simpson&amp;quot,
    &amp;quotOctober 27, 2014&amp;quot,
    &amp;quothttps://davidwalsh.name/for-and-against-let&amp;quot
);

forAgainstLet.print();
// Title: For and against let
// By: Kyle Simpson
// October 27, 2014
// https://davidwalsh.name/for-and-against-letتوجه کنید که هر دوتا فراخوانی از متد  print() کلاس های فرزند  استفاده کردن و سپس هر کدوم به دستور super.print() رسیدن و با استفاده از وراثت print  رو انجام دادن.بنابراین میتونیم بگیم که وراثت یه ابزار قدرتمند برای سازماندهی دادها و رفتارها در کلاس ها هستش که اجازه میده کلاس های فرزند امکان دسترسی و استفاده از داده ها و رفتارهای کلاس های پدر رو داشته باشن .Modulesالگو های module  هم در واقع همون هدف class ها رو داره ، یعنی گروه بندی داده ها و رفتار ها با هم در واحد های منطقی. همچنین مانند کلاس ها به دلیل همکاری ماژول ها با هم می تونن به داده ها یا رفتارهای  یکدیگر دسترسی داشته باشن. اما با هم تفاوت هایی هم دارند که از همه مهم تر syntax  کاملا متفاوتشون هستش.Classic Modules از نشانه های یک  classic module یک function  خارجی هستش که instance ماژول رو با یک یا چند کار کرد در معرض استفاده قرار میده و میشه با استفاده ازش روی داده های داخلی ماژول کار کرد. بنابراین چون ماژول ها در این فرم عملا یک function  هستند و فراخوانی اونها به عنوان instance تولید میشه توضیحات دیگر روی module factories هستش .به فرم کلاسیک ماژول کدی که برای کلاس ها بررسی کردیم توجه کنین  :function Publication(title,author,pubDate) {
    var publicAPI = {
        print() {
            console.log(`
                Title: ${ title }
                By: ${ author }
                ${ pubDate }
            `);
        }
    };

    return publicAPI;
}

function Book(bookDetails) {
    var pub = Publication(
        bookDetails.title,
        bookDetails.author,
        bookDetails.publishedOn
    );

    var publicAPI = {
        print() {
            pub.print();
            console.log(`
                Publisher: ${ bookDetails.publisher }
                ISBN: ${ bookDetails.ISBN }
            `);
        }
    };

    return publicAPI;
}

function BlogPost(title,author,pubDate,URL) {
    var pub = Publication(title,author,pubDate);

    var publicAPI = {
        print() {
            pub.print();
            console.log(URL);
        }
    };

    return publicAPI;
}با مقایسه این کد و کد قبل که برای فرم کلاس ها بود میبینیم که شباهت ها بیشتر از تفاوت ها هستند.در فرم کلاس ها داده ها و متد ها به عنوان یه object  ذخیره میشیدن که با this. میتونستیم بهشون دسترسی داشته باشیم ولی در ماژول ها داده ها و متدها به عنوان identifier variables هستن که می تونیم ازشون استفاده کنیم و نیازی به this.  نیستش. نحوه استفاده ازش رو ببینین :var YDKJS = Book({
    title: &amp;quotYou Don&#039;t Know JS&amp;quot,
    author: &amp;quotKyle Simpson&amp;quot,
    publishedOn: &amp;quotJune 2014&amp;quot,
    publisher: &amp;quotO&#039;Reilly&amp;quot,
    ISBN: &amp;quot123456-789&amp;quot
});

YDKJS.print();
// Title: You Don&#039;t Know JS
// By: Kyle Simpson
// June 2014
// Publisher: O&#039;Reilly
// ISBN: 123456-789

var forAgainstLet = BlogPost(
    &amp;quotFor and against let&amp;quot,
    &amp;quotKyle Simpson&amp;quot,
    &amp;quotOctober 27, 2014&amp;quot,
    &amp;quothttps://davidwalsh.name/for-and-against-let&amp;quot
);

forAgainstLet.print();
// Title: For and against let
// By: Kyle Simpson
// October 27, 2014
// https://davidwalsh.name/for-and-against-letهمونطور که میبینین تنها تفاوت قابل توجه اینجا عدم استفاده از new  هستش .ES Modulesاین ماژول ها در ES6 معرفی شدن و از نظر هدف مثل ماژول های کلاسیک هستند ولی در اجرا تفاوت زیادی دارند.اول اینکه در این نوع ماژول function  برای تعریف modules وجود نداره و هر file  یک module  هستش.دوم اینکه شما به طور صریح با api  ماژول ها تعامل ندارین بلکه از کلمه کلیدی export  برای اضافه کردن داده یا متد به api  عمومی استفاده میکنین . یعنی اگر چیزی در یک ماژول  ایجاد شده ولی export  نشده در داخل ماژول پنهان میمونه.سوم اینکه می تونین یه ماژول رو داخل یه ماژول دیگه import کنین و از نمونه اون استفاده کنین. اگر ماژول شما نیاز به پشتیبانی از multiple instantiations داره ابتدا باید یه module-style factory function تعریف کنین و سپس روی اون  ESM  رو تعریف کنین . به مثال زیر توجه کنین تا نحوه استفاده براتون واضح تر بشه . ابتدا فایل publication.js رو در نظر بگیرین :function printDetails(title,author,pubDate) {
    console.log(`
        Title: ${ title }
        By: ${ author }
        ${ pubDate }
    `);
}

export function create(title,author,pubDate) {
    var publicAPI = {
        print() {
            printDetails(title,author,pubDate);
        }
    };

    return publicAPI;
}برای import کردن و استفاده از این ماژول از ماژول  blogpost.js استفاده میکنیم :import { create as createPub } from &amp;quotpublication.js&quot;

function printDetails(pub,URL) {
    pub.print();
    console.log(URL);
}

export function create(title,author,pubDate,URL) {
    var pub = createPub(title,author,pubDate);

    var publicAPI = {
        print() {
            printDetails(pub,URL);
        }
    };

    return publicAPI;
}و در نهایت برای استفاده از این ماژول import  ش میکنیم داخل یه ESM  دیگه ای مثل main.js: import { create as newBlogPost } from &amp;quotblogpost.js&quot;

var forAgainstLet = newBlogPost(
    &amp;quotFor and against let&amp;quot,
    &amp;quotKyle Simpson&amp;quot,
    &amp;quotOctober 27, 2014&amp;quot,
    &amp;quothttps://davidwalsh.name/for-and-against-let&amp;quot
);

forAgainstLet.print();
// Title: For and against let
// By: Kyle Simpson
// October 27, 2014
// https://davidwalsh.name/for-and-against-letهمانطور که دیدین در صورت نیاز برای پشتیبانی از multiple-instantiation می تونین از ESM داخل classic modules استفاده کنین .من تلاشم رو کردم که کدهایی که تو این فصل بود رو براتون بیارم و تا جایی که می تونم توضیح بدم ولی حتما حتما حتما کل فصل رو دقیق و کامل از خود کتاب بخونین ، چندین بار ...خوشحال میشم نکته ای بود که به بهتر شدن مبحث کمک کنه رو بگین تا با هم ازش استفاده کنیم و بهتر یاد بگیریم . </description>
                <category>عارفه حمیدی</category>
                <author>عارفه حمیدی</author>
                <pubDate>Wed, 04 Mar 2020 03:25:20 +0330</pubDate>
            </item>
                    <item>
                <title>You Don&#039;t Know JS (Get Started-ch2 - part1)</title>
                <link>https://virgool.io/@arefe_hamidi/you-dont-know-js-get-started-ch2-part1-fqanywagzypo</link>
                <description>Surveying JSتمرکز فصل دوم کتاب بر چگونه کار کردن زبان js هستش و برخی از زمینه های اصلی زبان رو مورد بررسی قرار میده تا زبان رو بهتر بشناسیم و بتونیم با اعتماد به نفس بیشتری برنامه هامون رو بنویسیم.این فصل جزیئات زیادی داره و برای هر بخش نیازه که وقت کافی در نظر گرفته شه و با دقت تمرین شه. همونطوری که خود کتاب هم میگه : The best way to learn JS is to start writing JS.Each File is a Programمعمولا هر website  یا  web application  شامل چند فایل js مختلف هستش (معمولا با پسوند .js ).  به طور معمول کل برنامه رو به عنوان یک برنامه در نظر میگیرن که این در js  درست نیست. در js هر فایل برنامه مستقل خودش رو داره . دلیل این امر در درجه اول مربوط به error handling هستش این ویژگی باعث میشه اگه یک فایل در زمان تجزیه یا اجرا به مشکلی بر خورد و fail شد کل برنامه دچار مشکل نشه و بقیه ی فایل ها اگه مشکلی نداشته باشن اجرا بشن . بنابراین خیلی مهم هستش که مطمئن بشیم همه فایل ها دارن به درستی اجرا میشن.شاید در نظر گرفتن هر فایل js به عنوان برنامه ای جدا عجیب باشه در واقع فایل های js  به عنوان فایل های همکار در کنار هم عمل میکنن و یه app  بزرگ رو میسازن.در بسیاری از پروژه ها هم از ابزار build process استفاده میکنن که باعث میشه همه ی فایل های js  موجود با هم ترکیب بشن و نهایتا یه فایل js برای ارسال به صفحه وب استفاده بشه که با این فایل ترکیبی منفرد به عنوان کل برنامه برخورد میشه.تنها راهی که چندین فایل .js به عنوان یک برنامه واحد عمل کنن اشتراک گذاری وضعیت آنها از طریق &quot;global scope&quot; هستش.از زمان ES6 علاوه بر قالب برنامه استاندارد js  از یک قالب module هم پشتیبانی شده که اگه یک فایل از مکانیسم module-loading  مانند import یا استفاده از &lt;script type=module&gt; استفاده کرد تمام کد به عنوان یک module واحد در نظر گرفته بشه. Valuesاساسی ترین واحد اطلاعات در یک برنامه value ها هستند. value  ها داده ها هستند یا برای حفظ حالت ها اسفاده میشن . value ها به دو دسته primitive و object تقسیم میشن. در برنامه ها value ها با literal خاصی تعبیه شدن.greeting(&amp;quotMy name is Kyle.&amp;quot);در برنامه بالا &quot;My name is Kyle.&quot; یک primitive string literal هستش. string ها مجموعه ای از characters هستند که برای نمایش کلمات و جملات استفاده میشن. برای محاصره کردن، جدا کردن یا تعریف کردن یک str  از double-quote &quot; یا single-quote &#x27; استفاده میشه. همچنین میشه از back-tick &#x60; هم استفاده کرد که در طول برنامه برای حفظ خوانایی کد و بر اساس قابلیت استفاده میتونیم انتخاب و استفاده کنیم. به کد زیر و نتیجه هر سه مورد توجه کنید :console.log(&amp;quotMy name is ${ firstName }.&amp;quot);
// My name is ${ firstName }.

console.log(&#039;My name is ${ firstName }.&#039;);
// My name is ${ firstName }.

console.log(`My name is ${ firstName }.`);
// My name is Kyle.فرض کنید برای firstName  مقدار &#x27;Kyle&#x27; تعریف شده در حالت سوم که از &#x60;  استفاده شده با گذاشتن value داخل {...}$ مقدار فعلی firstName درنتیجه دیده میشه. که به این interpolation میگن.به جز  String  ها برنامه ها js  حاوی primitive literal values های دیگه ای از جمله Boolean و number ها هستن. while (false) {
    console.log(3.141592);
}با استفاده از while می تونیم یه حلقه (loop) رو نمایش بدیم. در قطعه کد بالا هرگز حلقه اجرا نخواهد شد چون از مقدار Boolean  false  برای شرط حلقه استفاده کردیم. دقت کنید که مقدار Boolean true هستش که باعث اجرای حلقه میشه.مقادیر number هم در برنامه ها برای حفظ مقادیر عددی و همچنین برای شمارش (مثلا تعداد تکرار حلقه ها) به کار میرن.علاوه بر String , Boolean , Number دو primitive values دیگر هم در js  داریم که null و undefined هستند. در حالی که بین این دو تفاوت هایی وجود داره ولی در بیشتر قسمت ها هر دو به معنی تهی بودن یا عدم وجود ارزش هستند. با این حال بهتر این هستش که از undefined  برای single empty value ها استفاده بشه. اخرین primitive value که باید بهش توجه کرد symbol ها هستند که منحصرا به عنوان کلیدهای شاخص در object  استفاده میشن.hitchhikersGuide[ Symbol(&amp;quotmeaning of life&amp;quot) ];
// 42در برنامه های معمولی js معمولا از symbol ها استفاده مستقیم نمیکنیم و ازشون تو کدهای سطح پایین مثل libraries و frameworks استفاده میشه.Arrays And Objectsعلاوه بر primitive ها نوع دیگه ای از  value  ها  object  ها هستند.  Array ها هم یک نوع خاصی از object ها هستند که از یک لیست داده مرتب شده و فهرست بندی شده عددی تشکیل شدن. var names = [ &amp;quotFrank&amp;quot, &amp;quotKyle&amp;quot, &amp;quotPeter&amp;quot, &amp;quotSusan&amp;quot ];

names.length;
// 4

names[0];
// Frank

names[1];
// Kyleتوجه کنید که از 1 برای element  که در position دوم هستش استفاده میکنیم در واقع index های آرایه ها 0-based هستند یعنی 0 موقعیت اول را نشان می دهد.آرایه های JS می توانند هر نوع value یعنی primitive  یا object رو نگه دارن. Objects ها به نسبت Array  عمومی تر هستند و به جای موقعیت عددی با استفاده از str هایی که نام اون موقعیت ها هستند که بهشون  key یا  property گفته میشه به element ها دسترسی دارین.var me = {
    first: &amp;quotKyle&amp;quot,
    last: &amp;quotSimpson&amp;quot,
    age: 39,
    specialties: [ &amp;quotJS&amp;quot, &amp;quotTable Tennis&amp;quot ]
};

console.log(`My name is ${ me.first }.`);در اینجا me  یک object رو نمایش میده و first  نام مکانی اطلاعاتی در این شی رو نشون میده (value collection). روش دیگر برای دسترسی به اطلاعات استفاده از property/key هستش که داخل square-brackets [] استفاده میشه به عنوان مثال:me[&amp;quotfirst&amp;quot]Value Type Determinationبرای مشخص کردن نوع value  می تونیم از اپراتور typeof  کمک بگیریم . باید توجه کنیم که برای value هایی که primitive هستن نوع داخلیش رو مشخص میکنه و در غیر اینصورت میگه که object هستش. به مثال زیر دقت کنین: typeof 42;                  // &amp;quotnumber&amp;quot
typeof &amp;quotabc&amp;quot               // &amp;quotstring&amp;quot
typeof true;                // &amp;quotboolean&amp;quot
typeof undefined;           // &amp;quotundefined&amp;quot
typeof null;                // &amp;quotobject&amp;quot -- oops, bug!
typeof { &amp;quota&amp;quot: 1 };          // &amp;quotobject&amp;quot
typeof [1,2,3];             // &amp;quotobject&amp;quot
typeof function hello(){};  // &amp;quotfunction&amp;quotهمونطور که میبینین برای حالت null  انتظار میره که نوعش رو null  بگه در حالی که object تعریف کرده. همچنین این حالت برای array هم هستش و اون هم object گفته.Declaring and Using Variablesبه Variables (متغییر) مانند ظرفی برای نگه داشتن value ها فکر کنید. برای استفاده باید variable ها اعلام بشن (declare , create) . برای این کار identifiers (شناسه) های مختلف وجود داره که هر کدوم رفتارهای متفاوت خودشون رو دارن.مثلا var  رو در نظر بگیرین :var myName = &amp;quotKyle&amp;quot
var age;کلمه کلیدی var  بهمون این امکان رو میده که از یک متغییر تو یه قسمت از کد بتونیم استفاده کنیم. همچنین زمان تعریف متغیر میتونیم بهش مقدار اولیه هم بدیم.کلمه کلیدی بعدی که مشابه var هستش let :let myName = &amp;quotKyle&amp;quot
let age;کلمه کلیدی let  به نسبت var  دسترسی محدود تری رو میده در واقع دسترسیش از نوع &quot;block scoping&quot; هستش. به کد زیر توجه کنین تا تفاوتش واضح تر بشه:var adult = true;

if (adult) {
    var myName = &amp;quotKyle&amp;quot
    let age = 39;
    console.log(&amp;quotShhh, this is a secret!&amp;quot);
}

console.log(myName);
// Kyle

console.log(age);
// Error!همونطور که میبینین متغییر myName خارج از block  هم قابلیت دسترسی داره ولی برای age این امکان وجود نداره. میتونیم اینطور نتیجه بگیرم که برای جلوگیری از همپوشانی مقادیر اسم متغییرهای مشابه میتونیم از let  استفاده کنیم و برای دسترسی وسیع تر به یه متغییر هم میتونیم از var  کمک بگیریم .سومین فرم declaration  هم const  هستش . این شناسه مثل let هستش با این تفاوت که یه محدودیت دیگه هم داره که حتما باید یه مقدار اولیه براش تعریف کرد و بعدا هم در طول برنامه نمیشه مقدارش رو تغییر داد.  به کد زیر توجه کنید:const myBirthday = true;
let age = 39;

if (myBirthday) {
    age = age + 1;    // OK!
    myBirthday = false;  // Error!
}متغییر myBirthday  چون const هستش نمیشه مقدار جدید بهش re-assigned کرد.بهترین زمان استفاده از const  برای حالتی هستش که شما یه مقدار ساده primitive  دارین و می خوایین یه اسم مفید هم بهش بدین.const  باعث میشه برنامه تون راحت تر خونده بشه و خوانایی کد افزایش پیدا کنه.علاوه بر var و let و const ، شکل های نحوی دیگری نیز وجود داره که شناسه ها (متغیرها) را در حوزه های مختلف declare می کنن . مثلا:function hello(myName) {
    console.log(`Hello, ${ myName }.`);
}

hello(&amp;quotKyle&amp;quot);
// Hello, Kyle.شناسه hello یه scope  خارجی هستش که با function  هم همراه هستش و میشه فراخوانی کرد و ازش استفاده کرد اما پارامتر myName  داخل خود function  فقط قابل استفاده هستش. نحو دیگری که متغییر رو declare میکنه catch  کردن هستش:try {
    someError();
}
catch (err) {
    console.log(err);
}مقدار err یک متغییر block-scoped هستش که فقط داخل catch قابل استفاده ست و مثل این میمونه که با let  تعریفش کنیم .برای اینکه فصل خیلی طولانی هستش ترجیح میدم ادامه فصل رو تو پست بعد بگم. از مباحث اصلی ادامه فصل مبحث function  ها و  class ها هستش. </description>
                <category>عارفه حمیدی</category>
                <author>عارفه حمیدی</author>
                <pubDate>Thu, 27 Feb 2020 03:47:25 +0330</pubDate>
            </item>
                    <item>
                <title>You Don&#039;t Know JS  (Get Started-ch1)</title>
                <link>https://virgool.io/@arefe_hamidi/you-dont-know-js-get-started-ch1-cge9hogvqd9p</link>
                <description>برای اینکه خودم رو مقید کنم که سری کتاب های You Don&#x27;t Know JS  رو دقیق و منظم بخونم سعی میکنم نکته هایی که ازش یاد میگیرم رو طی این سلسله پست ها مطرح کنم.این کتاب به عنوان یک کتاب مبتدی تعریف نشده بلکه برای آماده کردنمون برای درک عمیق تر js  هستش.کتاب 6 جلد هستش که می تونین از github هم مطالعه ش کنین.What Is JavaScript?فصل اول جلد اول اینطور شروع میشه :You don&#x27;t know JS, yet. Neither do I, not fully anyway. None of us do. But we can all start getting to know JS better.همیشه سر کلاس های دانشگاه و بین دوستا حرف از js  میشد بحث به اینجا میرسید که زبان خیلی پیچده ای هستش و دقیقا مشخص نیست چیکار داره میکنه و از زبان ایراد میگرفتن (که قطعا از بی سوادی خودمون نسبت به js بود و هستش). کتاب میاد و ویژگی های زبان رو اینطور بیان میکنه و میگه :1. The Web Rules Everything About (JS)نحوه اجرای js برای مرورگرهای وب از نظر عملی تنها واقعیتی هستش که اهمیت داره. در اکثر موارد مشخصات تعریف شده js  و js  که در موتورهای js مبتی بر مرورگر ها کار میکنند یکسان هستند اما عدم تطابقاتی هم وجود داره که باید در نظر گرفته بشه.همچین عدم تطابقاتی تاریخی هستش و موتورهای js دارای +20 سال رفتارهای قابل مشاهده در مورد ویژگی هایی هستند که با توجه به محتوای وب به آنها اعتماد کرده. بنابراین گاهی اولویت موتورهای js این هستش که از انطباق با تغییرات متناقض خودداری کنه چون باعث میشه محتوای وب شکسته بشه.2. Not All (Web) JS...دومین مورد function ها و  object  هایی هستند که در واقع بخشی از مشخصات رسمی خود js نیستند. مثلا alert و console.log توسط js  تعریف نشدند و اکثرا اینها رو  js  در نظر میگیرن و بسیاری از تفاوت هایی که مردم ازش شکایت دارند به دلیل تفاوت در نحوه عملکرد رفتار محیطی هستش نه در نحوه عملکرد خود js. 3. It&#x27;s Not Always JSکنسول در تلاش نیست وانمود کنه که کامپایلر js  هستش که کد نوشته شده رو دقیقا به همون روش موتورهای js  اجرا کنه. بلکه در تلاش هستش که نتیجه کد js نوشته شده رو بلافاصله مشاهده کنین.اینها دو مورد کاملا متفاوت هستن و نمیشه از یه ابزار انتظار داشت که بتونه هر دو قابلیت رو به طور یکسان اداره کنه. بنابراین به نتیجه ای که در کنسول مشاهده میکنین به عنوان عملکرد دقیق js  اعتماد نکنین. در عوض کنسول رو یک محیط &quot;JS-friendly&quot; در نظر بگیرین که در این صورت مفید هستش . Backwards &amp; Forwardsیکی از اساسی ترین اصولی که js  رو راهنمایی میکنه رویکرد حفظ سازگاری با عقب (Backwards )  هستش. به این معنی که وقتی ویژگی ای به عنوان js معتبر پذیرفته شد تغییری در زبان ایجاد نمیکنه که باعث بشه کد های قبلی  js  نا معتبر بشه. همانطور که اعضای TC39  اغلب اعلام میکنن:&quot;we don&#x27;t break the web!&quot;بنابراین توسعه دهنده js  میتونه کدش رو با اطمینان بنویسه که کدش متوقف نمیشه از طرفی این اصل باعث میشه استفاده از js  برای برنامه های سرمایگذاری آینده عاقلانه تر به نظر برسه .در مقایسه با رویکرد حفظ سازگاری با عقب (Backwards ) رویکرد حفظ سازگاری با جلو (Forwards) رو داریم که باعث میشه با اضافه شدن ویژگی جدید همچنان بتونیم کد js  رو تو موتور قدیمی تر  js  هم اجرا کنیم و باعث شکستن برنامه نشه که این ویژگی در js  وجود نداره .What&#x27;s in an Interpretation?یه سوال بحث بر انگیز که برای کد js  وجود داره اینکه آیا یک اسکریپت تفسیری هستش یا برنامه کامپایل شده ؟؟ اکثرا نظرشون اینکه js  یک زبان مفسری (scripting)  هستش ولی حقیقت خیلی پیچیده تره .زبانهایی که به عنوان زبان کامپایلری در نظر گرفته میشن معمولا فرم باینری از برنامه رو تولید میکنن که این در js مشاهده نمیشه(در js کد منبع اجرا میشه نه فرم باینری).زبانهای مفسری معمولا خط به خط و از بالا به پایین اجرا میشن. (شکل 1 رو ببینین)در زبان مفسری اگه خطایی خط 5 وجود داشته باشه تا زمانی که خط 1 تا 4 اجرا نشه ، پیدا نمیشه. نکته مهمی که وجود داره اینکه ممکنه این خطا مربوط به زمان اجرا نباشه و مثلا مربوط به عملیات یا دستور نادرستی در اون خط باشه.می تونیم این ویژگی رو با زبانهای کامپایلری که قبل از هرگونه اجرایی مرحله پردازش و تجزیه رو انجام میدن مقایسه کنیم . (شکل 2 رو ببینین)مرحله تجزیه باعث میشه خطای خط 5 قبل از شروع اجرا پیدا بشه و اجرا برانامه رو متوقف کنه . بنابراین یک زبان کامپایلری بعد از مرحله تجزیه کدی رو تولید میکنه که قابل اجرا هستش.کد js  قبل از اجرا تجزیه میشه و خطاهای اولیه کد مثل نام پارامترهای تکراری قبل از شروع اجرا کد گزارش میشه که این امر بدون تجزیه کد امکان پذیر نیست.با توجه به اینکه js  یک زبان تجزیه  شده است میشه گفت که یه زبان کامپایلری هستش ؟؟کتاب میگه که جواب بله نزدیکتر و منطقی تر از نه هستش چون وقتی کد به حالت درخت تجزیه (شکل 2) تبدیل شد دوباره به حالت خط به خط (شکل 1) تبدیل نمیشه. بنابراین js  یک زبان تلفیقی هستش که باعث میشه قبل از اجرای برنامه از نحو درست کد مطمئن بشیم که یک مدل متفاوت از زبان های مفسری قدیمی هستش که مسلما مفید تر هم هستش.جمع بندی که کتاب از این بخش انجام میده اینطوره :1. After a program leaves a developer&#x27;s editor, it gets transpiled by Babel, then packed by Webpack (and perhaps half a dozen other build processes), then it gets delivered in that very different form to a JS engine.2. The JS engine parses the code to an AST.3. Then the engine converts that AST to a kind-of byte code, a binary intermediate representation (IR), which is then refined/converted even further by the optimizing JIT compiler.4. Finally, the JS VM executes the program.Strictly Speakingنباید به این ویژگی زبان به عنوان یه محدودیت در مورد انچه که نمیشه انجام داد در نظر گرفت بلکه به عنوان راهنمایی برای بهتر انجام شدن کارهاست تا موتور js بهترین حالت رو برای بهینه سازی و کارآمدتر اجرا شدن کد داشته باشه. ماژول های ES6 کلیه کدها رو به طور خودکار در این حالت در نظر میگیرن.سعی کردم نوشتار مناسبی داشته باشم و نکات مهمی که فصل اول کتاب داشتش به طور خلاصه منتقل کنم. نکته ای، پیشنهادی، نظری برای بهتر و مفید تر شدن این پست و همچنین پست های بعدی دارین که در نظر گرفته بشه ممنون میشم بگید .</description>
                <category>عارفه حمیدی</category>
                <author>عارفه حمیدی</author>
                <pubDate>Sun, 16 Feb 2020 02:36:37 +0330</pubDate>
            </item>
            </channel>
</rss>