<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی پیرانی</title>
        <link>https://virgool.io/feed/@aliraam</link>
        <description>توسعه دهنده و طراح رابط کاربری توییتر من: @aliraam  / برای ارتباط با من به apirani3784 در جیمیل ایمیل بزنید.</description>
        <language>fa</language>
        <pubDate>2026-06-17 00:36:48</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/78/avatar/a6e48a.jpg?height=120&amp;width=120</url>
            <title>علی پیرانی</title>
            <link>https://virgool.io/@aliraam</link>
        </image>

                    <item>
                <title>به Media Queries های جدید سلام کردی؟</title>
                <link>https://virgool.io/@aliraam/media-queries-range-syntax-ursfdt4dasis</link>
                <description>امان از دست این مدیا کوئری! دوست داشتی، به درد بخور اما سردرد آورد :) ساختار نوشتنشون (syntax) یکم عجیب غریبه حداقل برای من و حتی ممکنه بعد از مدت ها استفاده ازشون بازم قاعده رو درست رعایت نکنیم مثلا وقتی میگیم min-width: 300pxیعنی چی اصلا؟ با من همراه شین تا با ویژگی که ارائه شده تا کوئری خوشگل تری رو بنویسیم بهتون بگم، اگه هم که قبلا راجبش خوندین یه مرور مجدد داشته باشیم.روش قدیمیهمونطور که احتمالا می دونید اگر بخواین یک کوئری برای اندازه های صفحه نمایش بزرگتر از یک عرض مشخص تعریف کنید، چیزی شبیه به این می نویسید:@media (min-width: 1000px) {}این مدل نوشتن فقط در عرض صفحه‌های 1000 پیکسل و بزرگتر اعمال میشن. اگر می خواین همین کارو را برای اندازه های کوچیک صفحه نمایش انجام بدین، همچین کاری رو باید انجام بدین:@media (max-width: 700px) {}خب رفقا، حالا اگه بخوایم با روش قدیم یه استایلی برای دستگاه های ما بین این دوتا سایز اعمال کنیم چیکار کنیم؟این روش قابل استفاده اس:@media (max-width: 700px) and (min-width: 1000px) {}این مدیا کوئری برای هر صفحه‌ای با عرض بین 700 تا 1000 پیکسل اعمال میشه، اما به طور کلی درک اون برای بیشترمون سخته و به عنوان مثال، اگه بخواین حالا ترکیبی از دستگاه ها مثله موبایل و دیوایس های رو میزی رو داشته باشین اوضاع پیچیده تر میشه. اینجاس که کوئری های جدید وارد میشن :)روش جدید؛ سلام کوئری های دوست داشتنی منبیاین کوئری هایی که قبلا نوشتن رو باز نویسی کنیم با روش جدید:/* Greater than or equal to 1000px */ 
@media (width &gt;= 1000px) {} 
/* Less than or equal to 700px */ 
@media (width &lt;= 700px) {} 
/* Between 700px and 1000px */ 
@media (700px &lt;= width &lt;= 1000px) {}این مدل جدید کوئری ها با اضافه کردن کمتر و بیشتر کد نویسی کوئری هارو راحت تر میکنه برامون و مهمتر از اون خوندنشون رو  بسیار آسون‌تر می‌کنه. من که خیلی با این ویژگی ما بین دوتا سایز حال میکنم حقیقتا :) تو لیست زیر ویژگی های جدیدی که اضافه شده به کوئری هارو باهم میبینیم: &lt;&lt;=&gt;&gt;==خب چهارتایی اولی که مشخصه اما داستان اون = آخری چیه؟ قصه از این قراره که شاید لازم باشه وقتی دقیقا سایز صفحه نمایش برابر با یه عددی مثلا 999 پیکسل شد یه بلایی سره سایتمون بیاریم اینجاست که این مساوی کاری خودشو انجام میده.حلال بسیاری از مشکلاتمثال زیرو ببینین رفقا:@media (min-width: 500px) {}@media (max-width: 500px) {}کوئری اول زمانی اتفاق میفته که دیوایس ها سایزشون بزرگتر از 500 باشه، دومی هم زمان اجرا میشه که کمتر از 500 باشن. اما شما به من بگین که چه بلایی سره خوده 500 میاد؟ اینجاس که مدل کوئری نویسی جدید میاد به داد ما میرسه:@media (width &gt;= 500px) {}@media (width &lt; 500px) {}حالا با این روش اگه لازم باشه خوده 500 هم هندل میشه به همین قشنگی، به همین خوشمزگی :)این خیلی خوف و خفن نیست ولی شاید روال توسعه رو و حل باگ تو موارد ریسپانسیو رو برامون بسیار راحت تر از قبل بکنه.پشتیبانی مرورگرهااما مسئله مهم تر پشتیبانی مرورگرها از این ویژگیه! خب میشه گفت بیشتر مرورگر ها از ویژگی پشتیبانی میکنن اما در جایی که میخواین مطمن باشین میتونین از ابزاری مثله PostCSS استفاده کنین تا با تبدیل کردن کد ها این ویژگی هارو تو همه مرورگرها براتون ارائه بدن. تو عکس زیر میتونین پشتیبانی مرورگرها از ویژگی رو به طور کامل ببینین:Media Queries: Range Syntaxجمع بندیبه پایان آمد این پست و حکایت همچنان باقیست. ویژگی باحالیه حقیقتا، امیدوارم که براتون مفید بوده باشه. خوشحال میشم اگه شما هم تجربه ای از استفاده از این ویژگی رو داشتین برام کامنت کنین نظرتون رو سایر پست های من در ویرگول https://virgool.io/@aliraam/escaped-css-selectors-bawjrbbpm5dy  https://virgool.io/@aliraam/%D8%A7%D8%B3%D8%AA%D8%A7%DB%8C%D9%84-%D8%AF%D9%87%DB%8C-%D8%B4%D8%B1%D8%B7%DB%8C-%D8%AF%D8%B1-sass-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-default-gm6eaqpwon2t  https://virgool.io/@aliraam/%D8%A8%D8%B1%DA%AF%D9%87-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8Ccheatsheet-%D8%AC%D8%A7%D9%85%D8%B9-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-y6yqmcq5jl6h </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Sat, 22 Apr 2023 12:30:04 +0330</pubDate>
            </item>
                    <item>
                <title>استایل دهی شرطی در Sass با استفاده از !default</title>
                <link>https://virgool.io/@aliraam/%D8%A7%D8%B3%D8%AA%D8%A7%DB%8C%D9%84-%D8%AF%D9%87%DB%8C-%D8%B4%D8%B1%D8%B7%DB%8C-%D8%AF%D8%B1-sass-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-default-gm6eaqpwon2t</link>
                <description>فلگ(flag) !default یک ویژگی برای مقدار دهی و استایل نویسی شرطی  در sass هست، با استفاده از این ویژگی مقدار زمانی انجام میشه که قبلا تعریف نشده باشه یا برابر با null باشه$variable: &#039;test&#039; !default;عبارت بالا در sass به شکل زیر تعریف میشه:مقدار متغییر variable برابر باشه با test، اما در صورتی که متغییر variable قبلا مقدار دهی نشده باشه.برای آشنایی بهتر با عملکرد این flag مثال زیر باهم ببینم:$variable: &#039;hello world&#039;; 
$variable: &#039;test&#039; !default;
// $variable still contains `hello world`با اجرای کد بالا، مقدار متغییر  همچنان برابر با &quot;hello world&quot; هست که در خط اول مقدار دهی شده و با خط دوم مقدارش تغییری نمیکنه و ignore میشه.آشنایی با استایل دهی از طریق @use...withیکی از مهم ترین دلایل استفاده از !default  استفاده همزمان از لایبراری های جانبی در بخش های مختلف پروژه هست. ممکنه شما از یک لایبری استفاده کنید با تعریف همنام متغییر هاتون به تداخل بخورین، اما زمانی که از  !default استفاده کنین در صورتی که همنام باشن مقدار دهی از ریشه اصلی استفاده میشه. توی sass یک ویژگی بسیار کاربردی برای زمانی هست که شما یک لایبرری رو اضافه میکنین و میخواین متغییر های موجود در اون لایبرری رو overrdie کنین:@use &#039;library&#039; with (
 $foo: &#039;hello&#039;, $bar: &#039;world&#039;
 );کد بالا عملکرد مشابهی به @import داره:$foo: &#039;hello&#039;; 
$bar: &#039;world&#039;; 
@import &#039;library&#039;;اما یک فرق اساسی داره، و دلیلی که پیشنهاد میشه از @use...with استفاده کنین تفاوت scope هست، جدای از این تفاوت اینکه کد برای توسعه دهنده خواناتر میشه override کردن مقادیر زمان اضافه کردن هست، همچنین باعث تعریف بیش از حد متغییر در سطح پروژه میشه، از طرف دیگه متغییر های global رو حفظ میکنه برای ما.رایج ترین استفاده ها: مورد اول: شخصی سازی قالب $color-primary: royalblue !default;
$color-secondary: salmon !default: 
// style.scss@use &#039;library&#039; with (
$color-primary: seagreen !default;
$color-secondary: lemonchiffon !default:
);یکی از مناسبترین مثال هایی که میشه برا کاربرد!default زد اضافه کردن ویژگی شخصی سازی تم برای سایر دولوپر ها و کاربر هاست. برای مثال بخش  رنگ بندی قالب رو میتونیم به صورت آپشنال قرار بدیم تا نسبت به نیاز کاربر تغییر داده بشه.برای مثال لایبراری بوت استرپ تو بخش Sass variable API های خودش همه متغییر هارو با استفاده !default در دسترس قرار داده. ( این متغییر ها شامل: رنگ بندی، کادر بندی، فاصله ها ،تنظیمات فونت و حتی انیمیشن ها میشه) البته شما میتونین بدون استفاده از Sass هم از این ویژگی استفاده کنین، میتونین به این لینک مراجعه کنین.مورد دوم: لود کردن وب فونت ها به صورت شرطی// library.scss
$disable-font-cdn: false !default;
@if not $disable-font-cdn {
  @import url(&#039;&#039;https://fonts.googleapis.com/css2?family=Public+Sans&amp;display=swap&#039;&#039;);
}
// style.scss
@use &#039;library&#039; with (
$disable-font-cdn: true
);
// no external HTTP request is madeهمونطور که تو کد بالا میبینین یک متغییر برابر با false شده و با استفاده از یک شرط اون متغییر رو بررسی میکنیم که وب فونت رو لود کنیم یانه، اینجاس که sass قدرت خودش تو پیش پردازنده هارو به نمایش میذاره.شما میتونین برای مطالعه بیشتر راجب این ویژگی ها به مطالب زیر مراجعه کنید:!default documentation@use with documentationBootstrap variable defaultsA Sass default use case (thoughtbot)از اینکه این مطلب رو مطالعه کردین ممنونم، خوشحال میشم نظراتتون تو بخش کامنت ها ببینم.برخی از مطالب من در ویرگول: https://virgool.io/@aliraam/%D8%B1%D8%B9%D8%A7%DB%8C%D8%AA-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%86-commit-%D8%A8%D9%87%D8%AA%D8%B1-%D8%AF%D8%B1-git-mtzpwpxnk0qt  https://virgool.io/@aliraam/escaped-css-selectors-bawjrbbpm5dy  https://virgool.io/@aliraam/%D9%BE%DB%8C%D8%B4-%D8%A8%D9%87-%D8%B3%D9%88%DB%8C-es-modules-xrlinktupu3w </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Sat, 15 May 2021 10:57:08 +0430</pubDate>
            </item>
                    <item>
                <title>پیش به سوی ES Modules</title>
                <link>https://virgool.io/@aliraam/%D9%BE%DB%8C%D8%B4-%D8%A8%D9%87-%D8%B3%D9%88%DB%8C-es-modules-xrlinktupu3w</link>
                <description>@Googleاگه کمی با جاوا اسکریپت عزیزمون سرو کله زده باشین قاعدتا میدونین که راه مختلفی برای import کردن packages ها هست که عبارتند از:CommonJS — module.exports and require used in Node.jsAsynchronous Module Definition (AMD)Universal Module Definition (UMD)شاید باورتون نشه ولی باید خدمتون بگم که هیچکدوم از اینا روش استانداردی تو جاوا اسکریپت نیست. تو ES6  روشی به نام single universal module معرفی شد.ES Modules از راه میرسید!!!اول از همه بگو ببینم خوده این ماژول (modules) تو جاوا اسکریپت  چی هست؟یه مثال از دنیای خارج از برنامه نویسی: نویسنده ها کتاب هاشون رو به فصل ها و بخش های گوناگون تقسیم میکنن، تو برنامه نویسی هم همین رو داریم، کد ها به بخش هایی به اسم ماژول تقسیم بندی میشه.از ویژگی های ماژول خوب میشه به تقسیم بندی مناسب ، متمایز و مستقل نسبت به سایر ماژول ها  نام ببریم در عین حال وقتی از چند ماژول مجزا استفاده میکنیم هیچ خلالی تو فرآیندمون به وجود نمیاد.حالا بگو چرا باید از ماژول (modules) استفاده کنم؟استفاده از ماژول ها به خودی خود فواید زیادی داره، اما سه تا مشخصه اهمیت بیشتری داره:1- قابلیت نگهداری یا Maintainability: طبق توضیحی که دادم ماژول ها مستقل از یکدیگر هستند. ماژولی که خوب طراحی بشه وابستگی ها رو کم میکنه و همین باعث میشه توسعه دادن تک ماژول ها بسیار راحت تر بشه. مثلا اگه یه ماژول داشته باشین و بخواین بخشی از کد رو آپدیت کنین نیاز نیست دیگه هر جا که استفاده شده مجدد به روزرسانی بشه، شما با آپدیت Core تغییرات رو تو همه جا اعمال میکنین.2- فضای نام یا Namespacing: تو جاوا اسکریپت متغییرات (variables) که خارج از اسکوپ تو سطح بالاتر از فانکشن یا بلاک ( {} ) تعریف میشن به صورت گلوبال هستند.(به این معنی که همه میتونن بهشون دسترسی داشته باشن) همین باعث میشه namespace ها الا بختکی در دسترس قرار بگیرند که اصلا دلیلی به انجام این کار نیست. انجام همچین کاری یه چیز تو مایه های ریختن قیمه ها تو ماستاس :))) ( به این لینک مراجعه کنید برای توضیحات بیشتر)3- قابلیت استفاده مجدد یا Reusability: اگه بخوایم بینی و بین الهی صادق باشیم با خودمون، خیلی هامون بیشتر از کد های آماده یا کد های قبلی مون استفاده میکنم و به صورت فرآیند پیچیده COPY/PASTE که بسیار وقت گیر هم هست به پروژه فعالمون اضافه میکنیم آیتم های مد نظرمون رو :))حالا با ماژول کردن کد هامون میتونیم با دغدغه کمتری این کارو انجام بدیم.حالا بگو ES Modules چی چی هست اصلا؟شاید اسمش قلمبه سلمبه باشه، اما احتمال میدم شما با سینتکس نمونه ای که در ادامه بهتون نشون میدم آشنا باشین، ما با این روش میتونیم فانکشن یا یک متغییر رو از یک پکیج export کنیم و تو بخش های دیگه مجدد فراخوانیشون کنیم:export const hoursInDay = 24
export const multiply = (a, b) =&gt; {
    return a * b
}ما میتونیم به اضای هر فایل، متد ها و متغییرات مختلفی رو export کنیم. برای import کردن هم مطابق روش زیر که اگه بخوایم هر فانکشن/متغییر که مورد نیاز ما باشه روش اول و اگه بخوایم به همه دسترسی داشته باشیم به روش دوم عمل میکنیم://1- import individual items
import {hoursInDay, multiply} from &#039;./somefile.js&#039;

//2- import the whole file
import * as test from &#039;./somefile.js&#039;حالا اگه این وسط بخواین dynamic import استفاده کنین تا لود کردن کد هارو مدیریت کنین که یک promise براتون return میکنه :switch (page) {
    case &#039;home&#039;:
        import(&#039;./home-page&#039;);
        break;
    case &#039;register&#039;:
        import(&#039;./register-page&#039;);
        break;به طبع شما میتونین به شکل زیر هم کار کنین:&lt;script type=&amp;quotmodule&amp;quot src=&amp;quot./somefile.js&amp;quot&gt;روش بالا  با اکثر مرورگر های استاندارد جواب میده. اگه بخواین تو Node.js کار کنین باید تو فایل package.json بخش &quot;type&quot;  رو برابر با &quot;module&quot;  تنظیم کنید. اما خب به طبع راه های رسیدن به خدا بیشتر از این حرفاس میتونین این لینک رو برای مطالعه بیشتر بررسی کنید.اصلا چرا باید این موضوع برامون اهمیت داشته باشه؟ES Modules توسط اکثر مرورگر های استاندارد پیشتیبانی میشه از طرف دیگه تو node js هم پشتیبانی میشه و الان بیشتر از قبل داره فراگیر میشهحالا دلایل اینکه بریم سمت ES Modules:پشتیبانی گستردهشما میتونی هر جا که جاوا اسکریپت مینویسی از این روش استفاده کنی، یک روش مشترک؛ تفاوتی بینبرای مرورگر یا nodejs نیست.مبتنی بر استانداردپشتیبانی گسترده به دنبالش یک استاندارد داره، این روشی که استفاده میکنیم چیزی خارج از JS نیست.کارایی (Performance)استفاده از ES Modules تو فرآیند tree shaking برای bundling به ما کمک میکنه. از اونجایی که کانفیگ کمتری برای مرورگر مورد نیازه میتونه با کم کردن build scripts های ما به افزایش Performance کمک کنه.برای مطالعه بیشتر لطفا به منبع زیر مراجعه کنید:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modulesاز اینکه تا انتهای مطلب همراه من بودین ممنونم، خوشحال میشم نظرتونو راجب ES Modules بدونم. شما از چه روشی استفاده میکنین؟سایر مقالات من در ویرگول: https://virgool.io/@aliraam/%D8%A8%D8%B1%DA%AF%D9%87-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8Ccheatsheet-%D8%AC%D8%A7%D9%85%D8%B9-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-y6yqmcq5jl6h  https://virgool.io/@aliraam/%D8%B1%D8%B9%D8%A7%DB%8C%D8%AA-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%86-commit-%D8%A8%D9%87%D8%AA%D8%B1-%D8%AF%D8%B1-git-mtzpwpxnk0qt  https://virgool.io/JavaScript8/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%BE%D8%B1%D8%A7%D9%BE%D8%B1%D8%AA%DB%8C-%D9%87%D8%A7%DB%8C-methodswatcherscomputed-%D8%AF%D8%B1-vue-ijiegv5bnu6q </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Wed, 24 Mar 2021 17:31:24 +0430</pubDate>
            </item>
                    <item>
                <title>برگه راهنمای(Cheatsheet) جامع برای توسعه دهندگان</title>
                <link>https://virgool.io/@aliraam/%D8%A8%D8%B1%DA%AF%D9%87-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8Ccheatsheet-%D8%AC%D8%A7%D9%85%D8%B9-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-y6yqmcq5jl6h</link>
                <description>Cheatsheet یا همون( برگه تقلب خودمون :) ) میتونن نکات کلیدی از هر آیتم مربوط به خودشون رو برای ما توضیح بدن، تو ادامه مطلب چند تا از Cheatsheet های کاربردی برای توسعه دهنده ها رو براتون میذارم1.دستورات کاربردی در Gitمنتشر شده توسط: Trilochan Parida2. دستورات کاربردی در Git با جزئیات بیشترمنتشر شده توسط:  Trilochan Parida3. راهنمای کاربر با Operator در جاوا اسکرپیتمنتشر شده توسط:  Proful Sadangi4. راهنمای کار با رشته (String) در جاوا اسکریپتمنتشر شده توسط:  Proful Sadangi5. راهنمای کار با تاریخ(Date) در جاوا اسکریپتمنتشر شده توسط:  Proful Sadangi6. راهنمای کار با آبجکت(Object) در جاوا اسکریپتمنتشر شده توسط:  Proful Sadangi7. راهنمای کار با آرایه (Array) در جاوا اسکریپتمنتشر شده توسط:  Proful Sadangi8. دستورات کاربردی CRONمنتشر شده توسط: Trilochan Parida9. راهنمای HTTP Status Codeمنتشر شده توسط:  Sid10. راهنمای کار با DOM در جاوا اسکریپتمنتشر شده توسط:  Proful Sadangi11. راهنمای کار با CSS Selectorsمنتشر شده توسط: Trilochan Parida12. راهنمای کار با REGEX در جاوا اسکریپتمنتشر شده توسط:  Proful Sadangi13. راهنمای کار با Command-Line منتشر شده توسط:  Jatin Rao14. راهنمای کلید های میانبر در VSCode منتشر شده توسط: Visual Studio Code Tips and Tricks15. راهنمای استفاده از Moduleمنتشر شده توسط: Samantha Ming16. راهنمای کار با متد های آرایه در جاوا اسکریپتمنتشر شده توسط: Tomek Sułkowskiجمع بندیدوست ویرگولی من، امیدوارم Cheatsheet های بالا براتون مفید و کاربردی باشه، میتونید این نوشته رو بوکمارک کنید تا موقعی که نیاز داشته باشین ازش استفاده کنید.منبع تصاویر بالا پایین هر کدوم ذکر شده میتونید به لینک مربوط به هرکدوم سر بزنید.به پست های دیگه من هم سر بزنید: https://virgool.io/@aliraam/%D8%B1%D8%B9%D8%A7%DB%8C%D8%AA-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%86-commit-%D8%A8%D9%87%D8%AA%D8%B1-%D8%AF%D8%B1-git-mtzpwpxnk0qt  https://virgool.io/JavaScript8/use-this-keyword-in-javascript-cpncf5vwru07  https://virgool.io/JavaScript8/%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-rkzpcnejj6dg </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Tue, 23 Mar 2021 18:54:56 +0430</pubDate>
            </item>
                    <item>
                <title>رعایت الگوها برای نوشتن commit  بهتر در Git</title>
                <link>https://virgool.io/@aliraam/%D8%B1%D8%B9%D8%A7%DB%8C%D8%AA-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%86-commit-%D8%A8%D9%87%D8%AA%D8%B1-%D8%AF%D8%B1-git-mtzpwpxnk0qt</link>
                <description>Yancy Min @unsplashنوشتن یک کامیت (commit) هنگام استفاده از git میتونه کمک شایانی هنگام ایجاد revision history بکنه. اما قبل از این مورد باید کل اعضای تیم روی یک الگو به توافق برسند و طبق همون الگو جلو برند، همین مورد میتونه تو پروژه های شخصی هم قرارداد بشه.تو این مطلب باهم بررسی میکنیم که چطور بتونیم یک کامیت بهتر بزنیم و اصلا دلیل خوب کامیت زدن چی هست1 - کامیت (commit) چی هست اصلا؟کامیت یک command هست برای ذخیره تغییرات تو local repository بعد از اینکه تو stag قرار میگیره. ما برای تغییراتی که انجام میدم کامیت میزنیم تا بدونیم که روال تغییرات به چه صورتی بوده و چه تغییراتی داشتیم. برای کامیت زدن option های متفاوتی داریم:با استفاده از -mgit add static/admin/config.yml
git commit -m &amp;quotSetup multiple roles for netlify-cms git gateway&amp;quotبا استفاده از -a or --allتو این روش همه تغییرات شامل فایل های tracked، modified و حذف شده کامیت میشنgit commit -a -m &amp;quotAdd a new role for netlify-cms git gateway&amp;quotبا استفاده --amendاین option آخرین کامیت رو با همه تغییرات حال حاضر  stag بازنویسی میکنه یا یک message کامیت جدید میزنه روی کامیتی که به remote repository ارسال نشدهgit add .
git commit --amend -m &amp;quotUpdate roles for netlify-cms git gateway&amp;quotرعایت الگوی Semanticتوی الگوی Semantic به طور کلی یک commit مشابه زیر هست:&lt;type&gt;(&lt;scope&gt;): &lt;subject&gt;مقدار type باید برابر با یکی از آیتم های زیر باشه:build: ایجاد تغییرات مرتبط  (برای مثال: اضافه کردن dependencies های خارجی مثلا با npm)chore: اضافه کردن تغییراتی که برای همه مشخص نیست  (برای مثال: تغییر دادن تو فایل .gitignore)feat: اضافه کردن ویژگی جدیدfix: رفع یک باگdocs: تغییرات مربوط به مستنداتrefactor: تغییری که نه  یک ویژگی اضافه میکنه نه مشکلی رو حل میکنه. (برای مثال تغییرات در نام گذاری متغییرات)perf: تغییراتی که باعث بهبود کارایی میشهstyle:تغییراتی که مرتبط با  تغییرات ظاهری هست test:اضافه کردن تست جدید یا تغییر در تست های قبلیمثال های از توضیحات بالا:git feat &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;feat: commit message here&#039;
git docs &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;docs: commit message here&#039;
git chore &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;chore: commit message here&#039;
git fix &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;fix: commit message here&#039;
git refactor &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;refactor: commit message here&#039;
git style &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;style: commit message here&#039;
git test &amp;quotcommit message here&amp;quot -&gt; git commit -m &#039;test: commit message here&#039;نکته: شما میتونید با لینکی که تو قسمت آخر مطلب گذاشتم از کامیت های Semantic استفاده کنین و یا مثه سابق معادلشون که رو به روشون تو مثال بالا هست استفاده کنید.پارامتر &quot;scope&quot; اختیاری هستاسکوپ (Scope) باید یک نام باشه  که اشاره به قسمتی از کد میکنهپارامتر &quot;subject&quot;استفاده الزامی از زمان حال برای مثال به جای استفاده از added یا adds از add در پیام کامیت استفاده کنیم.در آخر پیام کامیت از نقطه  . استفاده نکنیم.حروف اول رو به صورت capital ننویسیم.یک نمونه message کامیت رو تو پایین باهم ببینیم:feat: add hat wobble
^--^  ^------------^
|     |
|     +-&gt; Summary in present tense.
|
+-------&gt; Type: chore, docs, feat, fix, refactor, style, or test.اگه میخوای مثال بهتری تو دنیای واقعی ببینین به این لینک سر بزنین.از اینکه تا انتهای مطلب با من همراه بودین ممنونم، خوشحال میشم اگه نظری دارین راجب این مقاله با من در میان بذارین ☺️منابعی که در این مقاله ازشون استفاده شده:https://www.conventionalcommits.org/en/v1.0.0/https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716https://github.com/fteem/git-semantic-commitsبرخی از مقالات من در ویرگول: https://virgool.io/@aliraam/escaped-css-selectors-bawjrbbpm5dy  https://virgool.io/@aliraam/callback-function-in-js-mey4dk3ai8l2 </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Mon, 22 Mar 2021 17:05:17 +0430</pubDate>
            </item>
                    <item>
                <title>شخصی سازی CSS Selector ها</title>
                <link>https://virgool.io/@aliraam/escaped-css-selectors-bawjrbbpm5dy</link>
                <description> همونطور که میدونید تو CSS برای نام گذاری Selector ها یک سری قوانین وجود داره :-?[_a-zA-Z]+[_-a-zA-Z0-9]*طبق قوانین بالا سلکتور های ما میتونن با ( - )( _ ) و یا کاراکتر های ( A-Z a-z ) شروع بشن و در ادامه میشه از اعداد، ( _ ) و ( - ) استفاده کرد. حداقل تعداد اسم سلکتور باید دو کاراکتر باشه و نمیتونه با اعداد ، ( -- ) و یا (-) به همراه عدد شروع بشهبهتره اینو در نظر داشته باشیم که استفاده از (-) و یا ( _ ) بیشتر برای کلمات رزرو شده مثله -webkit-, -moz-, -o- or -ms- هست. ترجیحا بهتره برای نام گذاری از این روش استفاده نشه.استفاده از کاراکتر های ISO 10656 در اسامی سلکتور ها (escaped CSS selectors)اگر شما با فریمورکی مثله Tailwind آشنا باشید میدونید که این فریمورک تو اغلب نامگذاری هاش از &quot; :‌ &quot; استفاده کرده برای نمونه کد زیر رو ببینید:&lt;div class=&amp;quotsm:flex sm:items-center px-6 py-4&amp;quot&gt; اما خب همونطور که در اول گفتیم یه سری قوانین برای نام گذاری وجود داشت که ما نمیتونستیم آزادانه نام گذاری کنیم.  یه موضوعی هست به اسم escaped CSS selectors که Tailwind هم از همین روش برای نام گذاری کلاس هاش استفاده کرده. برای استفاده از این روش باید قبل از کاراکترهای ISO 10656 از &quot; / &quot; استفاده کنیم:/* sample 1 */

&lt;div class=&amp;quot@@@&amp;quot&gt;&lt;/div&gt;
.\@\@\@ {
    background: blue;
}

/* sample 2 */

&lt;div class=&amp;quotsm:flex sm:items-center px-6 py-4&amp;quot&gt;
.sm\:flex { ... } از اینکه در این مقاله  همراه من بودین سپاسگذارم، شما هم تجربه تو این موضوع دارین؟ خوشحال میشم نظراتتون رو زیر این پست ببینم و بیشتر باهم در ارتباط باشیمبرخی از  مقالات من: https://virgool.io/JavaScript8/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%BE%D8%B1%D8%A7%D9%BE%D8%B1%D8%AA%DB%8C-%D9%87%D8%A7%DB%8C-methodswatcherscomputed-%D8%AF%D8%B1-vue-ijiegv5bnu6q  https://virgool.io/JavaScript8/use-this-keyword-in-javascript-cpncf5vwru07 </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Tue, 14 Apr 2020 19:16:07 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با callback function</title>
                <link>https://virgool.io/@aliraam/callback-function-in-js-mey4dk3ai8l2</link>
                <description>آشنایی با callback functionمخلص کلام: callback function چیست؟به زبان ساده: Callback یک فانکشن هست که بعد از اینکه یک فانکشن اجرا شد و به پایان رسید اجرا میشه به همین دلیل بهش Callback میگن.یکم بپیچونیم حالا: تو جاوا اسکریپت، فانکشن ها از جنس آبجکت هستن. به همین دلیل فانکشن ها میتونن  یک فانکشن دیگه رو به عنوان آرگومان دریافت کنند، و میتونند توسط فانکشن های دیگه بازگشت داده بشند. فانکشن هایی که اینکارو انجام میدن بهشون higher-order functions گفته میشه. هر فانکشنی که به عنوان آرگومان پاس داده میشن callback function میگیم بهشون.اگه بخوایم راجبش صحبت کنیم مطالب زیادی هست ولی به همین اکتفا کنیم و چند تا مثال ببینیم.چرا ما به Callback نیاز داریم؟جاوا اسکریپت یک زبان رویداد محور(event driven) هست . این به معنیه که بجای اینکه منتظر پاسخ قبل از ادامه فرآیند بشه، جاوا اسکریپت اجرای فرآیند رو ادامه میده تا زمانی که به event بعدی برسه. بیاین یه مثال ساده رو باهم ببینیم:function first(){
  console.log(1);
}
function second(){
  console.log(2);
}
first();
second();همونطوری که انتظار میره، فانکشن first اجرا میشه و به طبع فانکشن بعدی فانکشن second خواهد بود. خروجی های ما به شکل زیر خواهد بود:// 1
// 2تا اینجا که همه چی خوبه :)اما فکر کنید که ما داخل فانکشن یک سری کد داریم که نمیتونه بلافاصله اجرا بشه، برای مثال ما یک ریکوئست API داریم که منتظر دریافت پاسخ هست. برای اینکه ما این شرایط رو شبیه سازی کنیم از setTimeout استفاده میکنیم که یک فانکشن جاوا اسکریپتی هست که بعد از یک زمان معین یک فانکشن رو اجرا میکنه. ما زمان اجرای فانکشنمون رو 500 میلی ثانیه تنظیم میکنیم تا بتونیم فرآیند شبیه سازی رو انجام بدیم:function first(){
  // Simulate a code delay
  setTimeout( function(){
    console.log(1);
  }, 500 );
}
function second(){
  console.log(2);
}
first();
second();خروجی کد بالای ما چی میتونه باشه؟ آیا مثه سری قبل هست؟خروجی کد بعد از فراخوانی:first();
second();
// 2
// 1ما اول فانکشن first() رو صدا  کردیم اما چه اتفاقی افتاد که اولین خروجی ما مقدار فانکشن دومه؟ منطقا به این دلیل نیست که جاوا اسکریپت اومده به دلخواه خودش ترتیب رو عوض کرده. به این دلیله که جاوا اسکریپت منتظر دریافت جواب از first() نمیمونه.اما چرا اینو گفتم؟ به این دلیل که شما نمیتونی یک فانکشن رو بعد یه فانکشن صدا کنی و امیدوار باشی که  به ترتیبی که میخوای اجرا بشن. Callback  یک روشی هست که شما رو مطمئن میکنه کد مد نظر ما، بعد از به اتمام رسیدن بخش های دیگه اجرا نمیشه و ترتیب لازم رعایت میشه.ساخت Callback حرف زدن کافیه، بیاین باهم یه Callback  بسازیم :)اگه ادیتور دم دست دارین میتونین تو اون کد بزنین در غیر این صورت Developer Console کروم رو با کلید ترکیبی ( Ctrl + Shift + J تو ویندوز) و (Cmd + Option + J تو مک) بزنید کد پایین رو تو بخش کنسول وارد کنید:function doHomework(subject) {
  alert&#40;`Starting my ${subject} homework.`&#41;;
}تو بالا، ما یک فانکشن با اسم doHomework ایجاد کردیم. فانکشن ما یک ورودی به عنوان متغییر میگیره، شما میتونین به شکل زیر فراخوانی کنید:doHomework(&#039;math&#039;);
// Alerts: Starting my math homework.بعد از پارامتر اولمون تو فانکشن بالا ما میتونیم callback پاس بدیم به شکل زیر:function doHomework(subject, callback) {
  alert&#40;`Starting my ${subject} homework.`&#41;;
 callback();
}

doHomework(&#039;math&#039;, function() {
  alert&#40;&#039;Finished my homework&#039;&#41;;
});همونطور که میبینین بعد از اجرای کد بالا شما دوتا alert پشت سر هم میگیرین. اما اینم بدونیم که اجباری نیست که ما فانکشن callback مون رو داخل فانکشن اصلی بنویسیم. میتونیم به شکل زیر عمل کنیم:function doHomework(subject, callback) {
  alert&#40;`Starting my ${subject} homework.`&#41;;
  callback();
}
function alertFinished(){
  alert&#40;&#039;Finished my homework&#039;&#41;;
}
doHomework(&#039;math&#039;, alertFinished);خروجی کد بالا مثله نمونه قبلی هست تنها  تفاوت تعریف فانکشن بیرون از فراخوانی فانکشن doHomework هست و ما به عنوان پارامتر دوم فانکشن دوم رو صدا زدیم.خب یه مثال واقعیکد پایین رو ببینید دوستان:sample.get(&#039;search/string&#039;, params, function(err, data, response) {
  if(!err){
    // This is where the magic will happen
  } else {
    console.log(err);
  }
})تو کد بالا ما یک ریکوئست با متد get ایجاد کردیم.ما سه تا پارامتر داریم اینجا: &#x27;search/string&#x27; این بخش ما مسیری که باید ریکوئست زده بشه رو قرار دادیم، params هم پارامتر های سرچ ماست و در نهایت یک anonymous فانکشن داریم که در اصل  callback ما هست.تو بالا callback برای ما اهمیت داره به این دلیل که باید منتظر دریافت پاسخ مناسب از سرور باشیم تا بتونیم قدم بعدی رو انتخاب کنیم. پاسخ دریافتی چه error باشه چه successful ما میتونیم تو callback با یک if() ساده اقدام لازمو انجام بدیم.بسیار عالی ، شما الان یه دانش نسبتا مناسبی در مورد اینکه callback چی هست و چطوری کار میکنه به دست آوردین. این مقاله به کلیات اشاره کرده و لازمه که بیشتر راجبش عمیق بشین تا درک مناسبت تری پیدا کنید.برای اینکه از انتشار مقالات جدید تو صفحه من در ویرگول مطلع بیشید، لطفا منو دنبال کنید :)</description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Sun, 22 Mar 2020 17:16:00 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با تفاوت پراپرتی های METHODS,WATCHERS,COMPUTED  در Vue</title>
                <link>https://virgool.io/JavaScript8/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%BE%D8%B1%D8%A7%D9%BE%D8%B1%D8%AA%DB%8C-%D9%87%D8%A7%DB%8C-methodswatcherscomputed-%D8%AF%D8%B1-vue-ijiegv5bnu6q</link>
                <description>بعد از مدت ها با یه پست اومدم خدمت شما اونم چه پستی :))) راجب Vue جان عزیزم، که تو اینجا میذارم تا هم خودم یاد بگیرم هم شاید بتونه به شما کمکی بکنه در درک بهتر Vueویو جی اس (Vue.js) استفاده از METHODSها،WATCHERS ها و COMPUTED پراپرتی هارو برامون فراهم کرده. اما چطور تشخیص بدیم که کی از کدوم استفاده کنیم؟؟ با من همراه باشین.زمان استفاده از METHODSزمانی که میخواین یه واکنشی نسبت به Event هایی که در DOM میفته نشون بدین.برای صدا زدن یک فانکشن زمانی که یه اتفاقی قرار تو component شما بیفته. شما میتونید یک متد رو از computed properties یا watchers صدا بزنید. زمان استفاده از COMPUTED PROPERTIESزمانی که شما احتیاج دارین یک دیتای جدید از دیتا هایی که الان دارین بسازین.زمانی که شما یک متغییری دارین که در template تون استفاده کردن، که این متغییر از یک یا چند data properties ساخته شده.زمانی که شما میخواین از پیچیدگی ها کم کنین، پراپرتی های تو در تو قابلیت خوانایی بیشتر داشته باشن و استفاده از اون ها راحت بشه، اونو آپدیت مکنین زمانی که پراپرتی اصلی تغییر میکنه.زمانی که شما لازمه یک مقدار رو ارجاع بدین به template. در این مواقع، ساختن یک computed property بهترین کاریه که میتونین بکنید چرا که اون ذخیره یا cache میشه.زمانی که شما لازمه تغییراتی بیشتر از یک دیتا property  رو بررسی کنید.زمان استفاده از  WATCHERS زمانی که شما میخواین تغییرات دیتا property رو بررسی کنین و یک سری عمل رو انجام بدین.شما میخواین تغییرات prop value رو بررسی کنین.شما فقط نیاز دارین یک property خاص بررسی کنین( شما نمیتونین از watch برای properties های چندگانه (multiple ) در یک زمان استفاده کنید.)زمانی که شما میخواین یک دیتا پراپرتی رو watch  کنید تا زمانی که به یک مقدار مشخصی که شما میخواین برسه و بعد یک سری کار رو انجام بدین.امیدوارم این مطلب براتون مفید بوده باشه، آیا شما هم با این سه مورد تو Vue.js کار کردین؟ موردی هست که بخواین اضافه کنید بهش؟ خوشحال میشم نظراتتون رو در پایین پست ببینم و باهم بیشتر صحبت کنیم. :)</description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Fri, 05 Oct 2018 21:23:39 +0330</pubDate>
            </item>
                    <item>
                <title>قدرت تمرکز بر روی یک کار</title>
                <link>https://virgool.io/@aliraam/%D9%82%D8%AF%D8%B1%D8%AA-%D8%AA%D9%85%D8%B1%DA%A9%D8%B2-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%DB%8C%DA%A9-%DA%A9%D8%A7%D8%B1-hijax4l0yrps</link>
                <description>این هفته ایده تمرکز کردن بر روی یک کار ( یک موضوع )  به ذهنم جرقه زد. من تصمیم گرفتم همه پادکست هایی که در گوشی دارم رو پاک کنم به جز پادکست های  Tim Ferriss . البته بگم که که این ایده تو بقیه دسته بندی ها هم پیاده شد.من به صورت تصادفی موضوعی رو انتخاب میکردم و همینکارو باهاش انجام میدادموقتی که تصمیم میگرفتم بر روی موضوعی تمرکز کنم فاکتور های اضافی رو حذف میکردم برای مثال:در یک مقطع زمانی چند کتاب مطالعه میکردم اما الان یک کتاب تا به حال از چندین روش برای ازبین بردن و مدیریت استرس استفاده میکردم ولی الان فقط از مدیتیشن کمک میگیرم من الان روی یک آیتم از چیز هایی که دوست دارم کار میکنم نه بر روی همه اونهادر حال حاضر وقت خالیمو مدیریت شده و درست بروی یک فعالیت صرف میکنم تا اینکه بر روی چند کار و به صورت هول هولکی  آنچه انجام می دهید را ارزیابی کنید و یک چیز را ببینید اگه شما به هر قسمتی از زندگی خودتون نگاه کنید میبینید که به صورت غیر مستقیم، مقدار زمانی رو در اون موضوع صرف کردین، منم همین حسو داشتم اگه بخوام 5 سال گذشته رو ارزیابی کنم بیشتر وقت من صرف یادگیری و کار کردن شده. البته که روی موضوعات دیگه ای هم وقت گذاشتم و اما سعی کردم بیشتر از حد وقت برای اونها گذاشته نشه.وقتی که من در حال انجام یک کار بودم یک تصمیمی گرفتم و اون جلوگیری از احساساتی شدن نسبت انجام بقیه کار ها به صورت همزمان بودمن تا چند وقت قبل خیلی از پادکست ها رو گوش میکردم و اما الان به این نتیجه رسیدم که اکثر این پادکست هایی که علاقه به دنبال کردنشون دارم یک پیام دارن و اون چیزی نبود جز:تغییر زندگی به زندگی خودتون نگاه کنید و مطمئنا شما هم تو دسته بندی هایی که مشغول فعالیت بر روی اون هستین راه و روش های مشابهی رو پیدا میکنین.ایجاد تمرکز با انجام یک کارمطمئنا شما هم تا به الان شده که یک کارو انجام بدین  و متوجه شده باشین که تمرکزتون چندین برابر  شده. شما میتونید این تمرکز رو برای کار های دشوار و سختی که احتیاج به تمرکز بیشتر دارن هدایت کنید و این یکی از بهترین روش هاست.به نظر من تمرکز چیزی جز کنترل وضعیت موجود و بدست آوردن نتیجه دلخواه تو اون موضوع نیست.انجام یک کار باعث میشه شما بیشتر تمرین کنین و تمرکز بیشتری به دست بیارین. از این طریق شما میتونین به نقاط ضعف خودتون پی ببرین و اون ها رو بهبود ببخشین و همچنین نقاط قوت خودتون. این شکل از زندکی باعث میشه باز خورد واقعی دریافت کنین.&quot;مهترین چیزی که باید از اون نگه داری کنین اون چیزیه که مهمه&quot;  پس بقیه چیزها رو اگه نمیخواین دور بریزینفاکتور هایی که باید حواستون بهش باشه تا غرقتون نکنهما نمیتونیم در لحظه خیلی از چیز هارو حساب کنیم. قدرت انجام یک کار اینه که  حواستون به کارتون هست. ما میتونیم یک موضوع تو هر قسمتی از زندگیمون رو مدیریت کنیم. لحظه ای که ما زیاد انتخاب کنیم در نهایت با خستگی رو به رو میشیم و به قول قدیمیا از کرده خودمون شاید پشیمون بشیم. این دروغ که برای موفقیت باید همه ی کارها رو انجام بدین باعث غرق شدن شما میشه. تجربه من نشون میده که واقعیت جهت مخالف این موضوع هست.برای موفقیت، شما باید روی یک موضوع تمرکز کنید. موفقیت شدن چیزی جز  این نیست که  فرصت هاتون رو از دست ندین و اگر شما به طور مداوم خودتون رو در این موقعیت قرار بدین ، کاری جز ارسال انرژی منفی به سمت خودتون نکردین.بعضی وقتا شاید متوجه تاثیر انجام همزمان انجام چندکار نشین و بر عکس شاید باز خورد خوب بگیرین ولی در نهایت شاید باعث شکست شما بشه.  وقتی روی یک چیز تمرکز می کنید،  انرژی بیشتری دریافت می کنید. مثلا:یک پادکستیک بیزینسیک شریک زندگییک هدفیک احساسو...در نهایت قدرت انجام دادن یک کار رو در خودتون زیاد کنیدممنون از همراهیتون. شما تجربه ای تو انجام کار ها و رسیدن به اهدافتون  با انجام یک کار داشتین؟ راه ، روش و همچنین نظرتون رو خوشحال میشم زیر پست ببینم و بیشتر باهم راجبش صحبت کنیم. شاد باشین :)</description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Thu, 16 Aug 2018 18:22:09 +0430</pubDate>
            </item>
                    <item>
                <title>راهنمای استفاده از this در جاوا اسکریپت</title>
                <link>https://virgool.io/JavaScript8/use-this-keyword-in-javascript-cpncf5vwru07</link>
                <description>عکس از Pankaj Patel قرارگرفته در Unsplashدر جاوا اسکریپت یکی از خواصی ( properties ) هست که به طور پیشفرض به هر فانکشن ( function ) پاس داده میشود. مقدار آن بستگی به Object داره که توسط فانکشن صدا زده میشه  که عمدتا در زمان runtime جاوا اسکریپت تعریف میشه. اما عملکرد this به اون شکلی که تو ذهنتون هست ممکنه نباشه، پس با من همراه باشین تا بهتون بگم زمانی که میخواین مقدار this رو مشخص کنید چه حرکتی باید بزنین :))یه چند دقیقه وقتتون رو بذارین و کد زیر رو چک کنین، فک میکنین که خروجی چه میشه؟ کد رو تو بخش console مرورگرتون ( رو صفحه کلیک راست کنید و گزینه Inspect Element  در فایرفاکس و یا کلیک راست  و زدن گزینه Inspect در گوگل کروم و انتخاب گزینه console در کادر باز شده) اجرا کنید و خروجی رو ببینینlet myObject = {
  name: &quot;ali&quot;,
  age: 22,
  aboutMe: function(){
    return &quot;My name is &quot;+this.name+&quot;, I am &quot;+this.age + &quot; years old&quot;
  }
}
console.log(myObject.aboutMe());همونطور که متوجه شدین خروجی به شکل زیر خواهد بود: My name is ali, I am 22 years old ما از this برای ارجاع دادن به object  داخل فانکشن استفاده کردیم. به نظر ساده اس درست میگم؟  حالا به قسمت پایین توجه کنید:let myObject2 = {
  name: &quot;sara&quot;,
  age: 24,
  aboutMe: function(){
    return &quot;My name is &quot;+this.name+&quot;, I am &quot;+this.age + &quot; years old&quot;
  },
  child: {
    name: &quot;soheila&quot;,
    age: 2,
    aboutMe: function(){
      return &quot;My name is &quot;+this.name+&quot;, I am &quot;+this.age + &quot; years old&quot;
    }
  }
};
console.log(myObject2.aboutMe());
console.log(myObject2.child.aboutMe());فک کنم انتظار داشتین خروجیتون چیزه دیگه ای باشه، اما متاسفم :)) دستور دوم ما با نمایش خروجی اطلاعات فرزند ( child ) رو در  console  نمایش میده و نه والد رو. و میتونیم بگیم که  this  به صورت پیشفرض اشاره میکنه به نزدیک ترین  object ما. اما وقتی که ما فانکشن رو به صورت global تعریف کنیم قصه مون چطور میشه؟آبجکت عمومی ( یا به قول فرنگیا Global Object)هر فراخوانی یا تابعی که داخل یک  object  تعریف نشه وصل میشه به  global object، همونطور که آبجکت  Window  داخل مرورگر هست. شما میتونین برای رسیدن به حرف من this; رو داخل   console   مرورگر وارد کنید و اینتر رو بزنین تا نتیجه رو ببینین. این عمل آبجکت Window  رو به همراه خاصیت هاش ( properties ) و مقادیرش برمیگردونه.شما حتی میتونین  properties   رو از آبجکت تغییر بدین. کد زیر رو داخل   console  کپی / پیست کنین:console.log(this.color); //Undefined
this.color = &quot;Green&quot;;
console.log(this.color); //Greenخط اول ما مقدار  undefined  رو بر میگردونه، بخاطر اینکه آبجکت Window  ما هیچ پراپرتی با نام  color  رو در داخلش نداره. خط دوم یک پراپرتی با نام  color  ایجاد میکنه و مقدار  &quot;Green&quot;  بهش نسبت میده. و الان شما میبینید که تو خط سوم کدمون میتونیم به این پراپرتی دسترسی داشته باشیم.تا الان ما، کل حرفه ما سره این بود که runtime جاوا اسکریپت به ما کمک میکنه تا  مقدار this  چی باشه. اما این موضوع برای همه ی مواقع خوب نیست و فقط بعضی وقتا به داد ما میرسه و بعضی جاها کار پیچیده تر میشه. برای نمونه توبع ناهمگام یا ( asynchronous function ) در نظر بگیرید. کد زیرو ببینید و حدس بزنین که خروجی چه خواهد بود؟ تو کنسول مرورگرتون تستش کنید:let myObject3 = {
  firstName: &quot;Michael&quot;,
  age: 20,
  aboutMe: function(){
    setTimeout(function(){
      console.log(this.firstName + &quot; is &quot; + this.age + &quot; years old&quot;)
    },5000)
  }
}
myObject3.aboutMe();متد  aboutMe دارای یک فانکشن هست که فقط بعد از 5 ثانیه اجرا میشه، پس زمانی که اجرا میشه فانکشن رو برای بعدا نگه میداره. وقتی که در نهایت اجرا بشه اون در   global scope  نیست و خروجی بازگشتی ما به شکل زیر هست:undefined is undefined years old.دلیل این اتفاق خیلی  ساده است و اون این هست که کلمه  this  در زمان اجرا به آبجکت Window   اشاره میکنه و نه به  myObject3  و از اونجایی که هیج کدوم از اون پراپرتی ها در آبجکت Window   وجود ندارن مقدار  undefined برگشت داده میشه. اما خب ما چطور مشکل رو حل کنیم؟ ما باید به نحوی به  Async function  مون بگیم که کلمه  this  چی هست. نگران نباشین جاوا اسکریپت 3 راه برای راحتی ما گذاشته که عبارتند از  call, apply وbind استفاده از متد  Call همونطور که آبجکت ها دارای پراپرتی هایی از پیش تعریف شده است ( prototypes ) مثله  toString ، فانکشن ها هم این شکلی هستن. یکی از اون متد ها  call  هست. متد  call  در بسیاری از موارد استفاده میشه اما در نهایت یک مشکل رو حل میکنه.بیاین دوتا آبجکت جداگانه تعریف کنیم شبیه همونایی که قبلا داشتیم:let user1 = {
  name: &quot;touhid&quot;,
  sayHi: function(){
    return this.name + &quot; says Hi&quot;
  }
}
let user2 = {
  name: &quot;mitra&quot;,
  sayHi: function(){
    return this.name + &quot; says Hi&quot;
  }
}
console.log(user1.sayHi()); //touhid says Hi
console.log(user2.sayHi()); //mitra says Hiهر دو آبجکت فانکشن  sayHi  در درون خودشون دارند. الزامی نیست که ما کدهارو چند بار بنویسیم، ما باید تا جایی که میشه کد هامون رو باز نویسی کنیم تا به بهترین خروجی برسیم. ما میتونیم کد بالا رو به شکل زیر باز نویسی کنیم. ما میتونیم فانکشن رو یه بار بنویسیم و در آبجکت دوم با استفاده از متد  call  مقدار دهی کنیم:let user1 = {
  name: &quot;touhid &quot;,
  sayHi: function(){
    return this.name + &quot; says Hi&quot;
  }
}
let user2 = {
  name: &quot;mitra &quot;
}
console.log(user1.sayHi());           //touhid says Hi
console.log(user1.sayHi.call(user2)); //mitra says Hi در اینجا ما از فانکشن user1  که  sayHi   بود به همراه متد  call  برای مقدار دهی مجدد با استفاده از پاس دادن آرگومان user2 بود استفاده کردیم. اگر فانکشن ما باید پارامتر داشته باشه، ما میتونیم آرگومان هارو در متد  call   قرار بدیمlet user1 = {
  name: &quot;touhid &quot;,
  greet: function(msg, friend){
    return this.name + &quot; says &quot; +msg+ &quot; to &quot;+friend
  }
}
let user2 = {
  name: &quot;mitra &quot;
}
console.log(user1.greet(&quot;Hi&quot;, &quot;jalal&quot;));
//touhid says Hi to  jalal 
console.log(user1.greet.call(user2, &quot;Hello&quot;, &quot;habib&quot;));
//mitra says Hello to habibاستفاده از متد   Apply بسیار شبیه به متد  call  هست، متد  apply  دقیقا همینکارو با یک استثنا انجام میده، تنها یک آرگومان به رو میپذیره و زمانی که فانکشن ما بیشتر از یک پارامتر داشته باشه ما باید به صورت آرایه آرگومان هارو پاس بدیم.console.log(user1.greet.apply(user2, [&quot;Hello&quot;, &quot;Habeeb&quot;]));هر دو متد  call  و  apply  با اجرای تابع بلافاصله فراخوانی میکنند.  این مسئله یکی دیگه از مشکلاتی است که ما می خوایم از آنها در Asynchronous استفاده کنیم .استفاده از متد   Bind برخلاف  call  و  apply ، متد  bind  فانکشنی رو بازگشت میده که صدا شده باشه اما در حال حاضر اجرا نشده باشه.let myObject4 = {
  firstName: &quot;mohammad&quot;,
  age: 32,
  aboutMe: function(){
    setTimeout(function(){
      console.log(this.firstName + &quot; is &quot; + this.age + &quot; years old&quot;)
    }.bind(myObject4),5000)
  }
}
myObject4.aboutMe(); //mohammadis 32 years old این بار، خروجی درست به نظر میاد. متد  bind  به درستی به رفرنس آبجکتمون اشاره کرده.تو این مطلب ما با 3 روش آشنا شدیم که که میتونیم به  this مقدار بدیم. اما راه چهارمی هم هست که همینکارو میکنه و اون استفاده از  new  هست اما کمی توضیحش در این مقاله نمیگنجه ( به قول قدیمیا هر سخن جایی و هر نکته مکانی دارد :)) ) و به صورت جداگانه بعدا توضیح میدم خدمتتون.از اینکه در این مقاله هم همراه من بودین سپاسگذارم، شما هم تجربه تو این موضوع دارین؟ خوشحال میشم نظراتتون رو زیر این پست ببینم و بیشتر باهم در ارتباط باشیم https://virgool.io/JavaScript8/%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-rkzpcnejj6dg </description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Thu, 02 Aug 2018 17:44:07 +0430</pubDate>
            </item>
                    <item>
                <title>فیلتر ها در جاوا اسکریپت</title>
                <link>https://virgool.io/JavaScript8/%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-rkzpcnejj6dg</link>
                <description>سلام، تو اولین نوشته ی خودم در ویرگول میرم سراغ فیلترها در جاوا اسکریپتتو این مقاله با استفاده از مثال نحوه عملکرد سیستم آموزشی دانشگاه با فیلترها به خوبی آشنا میشیم.متد ()filter در مقایسه با متد های ()map و reduce خیلی ساده تر و با مسمی تره :))شما یک ارایه رو به عنوان ورود به این متد میدین و خروجی رو با یک فانکشن و شرطتون مشخص میکنید و در یک آرایه جدید تحویل میگیرین :)این بنظر خیلی ساده میرسه، اما من عادت دارم ساختار به طور کامل بفهمم تا بتونم راحتر با قضیه کنار بیام پس بیاین باهم بیشتر بریم تو فیلتر!!!متد ()Filter به صورت true و false بررسی میکنه و خروجی در قالب یک آرایه جدید هست.من متوجه شدم که فانکشن فیلتر یه چیزی تو مایه های سیستم پذیرش دانشکده هاست. این سیستم طبق معیار هایی که داره در انتخاب دانشجو ها تصمیم گیری میکنه و اونارو پذیرش میکنه. من از صمیم قلب آرزو میکنم که سیستم ورود دانشکده منعطف تر باشه و این پیچیدگی های گاها الکی و بی مورد حذف بشه، اما از بحث دور نشیم. بیشتر معیار ها در پذیرش نمره های دانشجو ها هست. به عکس زیر دقت کنید:نحوه ورود دانش آموزان به دانشکده و عملکرد متد فیلتر استفاده از  For Loop برای فیلتر کردن فانکشن بسیار خب، ما الان میخوایم یه ارایه از 4 دانش آموز رو درست کنیم با اسم و نمره شون. در یکی از دانشکده ها دانش آموز هایی که نمره شون 3.2 و بالاتر باشه رو پذیرش میکنن پس باید همچین چیزی داشته باشیم:  let students = [
  { 
    name: &quot;ali&quot;, 
    GPA: 3.3 
  }, 
  { 
    name: &quot;shila&quot;, 
    GPA: 3.1 
  }, 
  { 
    name: &quot;arezoo&quot;, 
    GPA: 3.65 
  }, 
  { 
    name: &quot;mohammad&quot;, 
    GPA: 3.8 
  }
] 

let admitted =[]; 

for (let i=0; i &lt; students.length; i++){ 
  if(students[i].gpa &gt; 3.2) 
    admitted.push(students[i]); 
} 

/*admitted = [
  { 
    name: &quot;ali&quot;, 
    GPA: 3.3 
  }, 
  { 
    name: &quot;arezoo&quot;, 
    GPA: 3.65 
  }, 
  { 
    name: &quot;mohammad&quot;, 
    GPA: 3.8 
  }
];*/تو کد بالا میبینید که بعد از تعریف ارایه دانش آموزان من با استفاده از حلقه ()for با استفاده شرطی که گذاشتم دانش آموز هارو فیلتر کردم. اما این یه راهیه که خودمونو اذیت کردیم با اینکه جواب داد و خروجی درسته اما تو ادامه به جای حلقه از متد فیلتر استفاده میکنیم و مزایاشو هم باهم چک میکنیم.استفاده از متد ()Filter بیاین باهم همون هدفی که بالا داشتیم رو با استفاده از متد فیلتر پیاده کنیم.1- فیلتر یک متد آرایه ای هست، خب ماهم با آرایه ای از دانش آموز ها شروع میکنیم2- از یک فانکشن بازگشتی (callback function) استفاده میکنه برای اجرای هر المنت در آرایه.3- در نهایت هم خروجی که کدوم المنت ها در خروجی هستند رو به صورت آرایه برگشت میده.اما کد: let students = [
  { 
    name: &quot;ali&quot;, 
    GPA: 3.3 
  }, 
  { 
    name: &quot;shila&quot;, 
    GPA: 3.1 
  }, 
  { 
    name: &quot;arezoo&quot;, 
    GPA: 3.65 
  }, 
  { 
    name: &quot;mohammad&quot;, 
    GPA: 3.8 
  }
] 

let admitted = students.filter(function(student){
   return student.gpa &gt; 3.2;
})

/*admitted = [
  { 
    name: &quot;ali&quot;, 
    GPA: 3.3 
  }, 
  { 
    name: &quot;arezoo&quot;, 
    GPA: 3.65 
  }, 
  { 
    name: &quot;mohammad&quot;, 
    GPA: 3.8 
  }
];*/همونطور که میبینین ورود ها و خروجی های ما یکسان هستند، اما تفاوت ها تو اینجا چی هست؟1- ما احتیاج نداریم که از قبل آرایه ی با اسم  admitted  رو تعریف کنیم و بعدا اون رو مقدار دهی کنیم. ما همونجا تعریفش کردم و مستقیم مشخص کردیم که با چه دیتایی قراره پرشه.2- ما از یک شرطی استفاده کردیم و در نهایت وضعیت رو برگشت دادیم ( به قول فرنگیا return statement)3- الان دیگه ما میتونیم از  student  برای هر المنتی استفاده کنیم، اگه یادتون باشه قبلا  students[i] رو تو   for loop استفاده میکردیم.شاید الان بگین که یه چیزی اینجا میزون نیست، پذیرش در دانشگاه در مرحله آخره اما تو کد های ما متغییر  admitted در اول قرار گرفته. شاید شما انتظار داشته باشین که آرایه نهایی رو داخل فانکشن ببینین اما ما اینجا از return برای مشخص کردن خروجی های استفاده کردیممثال 2 - استفاده از دو شرط داخل متد فیلترتا حالا، ما فقط از یک شرط تو متد فیلترمون استفاده میکردیم. اما همیشه که زندگی اینقد راحت نیست و ممکنه برای چک کردن شروط دیگه هم لازم باشه +10 تا فاکتور رو چک کنیم.اما در حال حاضر شما به دوتا فاکتور رضایت بدین علاوه بر نمره کل مثلا نمره مهارت های فنی هم با چک کنیم. دانش آموز باید نمره بالای 3.2 و مهارت بالای امتیاز 1900 داشته باشه. همون دستورات بالا رو به شکل زیر اصلاح میکنیم: let students = [
  {
    name: &quot;ali&quot;,
    GPA: 3.3,
    SAT: 2000
  },
  {
    name: &quot;shila&quot;,
    GPA: 3.1,
    SAT: 1600
  },
  {
    name: &quot;arezoo&quot;,
    GPA: 3.65,
    SAT: 1700
  },
  {
    name: &quot;mohammad&quot;,
    GPA: 3.8,
    SAT: 2100
  }
]

let admitted = students.filter(function(student){
   return student.gpa &gt; 3.2 &amp;&amp; student.SAT &gt; 1900;
})

/*admitted = [
  {
    name: &quot;ali&quot;,
    GPA: 3.3,
    SAT: 2000
  },
  {
    name: &quot;mohammad&quot;,
    GPA: 3.8,
    SAT: 2100
  }
];*/خیلی آشنا بنظر میاد نه؟ الان ما دوتا شرط داریم که خروجی هارو مشخص میکنه. اما بیاین یکم بیشتر روش کار کنیم، اگه قسمت فیلتر بالا رو به شکل زیر بنویسم چه اتفاقی میفته؟ به کد زیر دقت کنید: let admitted = students.filter(function(student){
   let goodStudent = student.gpa &gt; 3.2 &amp;&amp; student.SAT &gt; 1900
   return goodStudent;
})اگه از کد بالا خروجی بگیرین متوجه یه تفاوت دیگه میشین که خیلی مهمه !! که تفات این متد با حلقه for رو مشخص میکنه. اگه شما متغییر goodStudent  رو چک کنید متوجه میشد که خروجی true و false هست و نوع بازگشتی  boolean  هست.پس در واقع اون true و false تصمیم میگیرند که تو آرایه ای که بازگشت داده میشه کدوم مقادیر قرار بگیرند.در نهایت امیدوارم که این مطلب براتون مفید واقع شده باشه، شما تجربه استفاده از این متد رو داشتین؟ خوشحال میشم نظراتتون رو زیر این پست ببینم و باهم بیشتر صحبت و تبادل نظر کنیم :)</description>
                <category>علی پیرانی</category>
                <author>علی پیرانی</author>
                <pubDate>Fri, 13 Jul 2018 17:20:23 +0430</pubDate>
            </item>
            </channel>
</rss>