• قراردادهای کدنویسی جاوا اسکریپت مبانی جاوا اسکریپت

    هنگامی که یک برنامه نیاز به ذخیره یک مقدار برای استفاده بعداً دارد، آن مقدار به یک متغیر اختصاص می یابد. یک متغیر به سادگی یک نام نمادین برای یک مقدار است که امکان دریافت مقدار را با نام فراهم می کند، یعنی زمانی که نام متغیر در برنامه مشخص می شود، مقدار جایگزین آن می شود.

    یک متغیر نام خود را از این واقعیت گرفته است که مقدار آن در طول اجرای برنامه قابل تغییر است.

    ثابت ها

    یک ثابت فقط یک نام نمادین برای یک مقدار است. یک ثابت امکان ارجاع به یک مقدار را با نام می دهد، به این معنی که وقتی نام ثابت در برنامه مشخص می شود، مقدار جایگزین آن می شود. ثابت ها برای ذخیره داده هایی استفاده می شوند که نباید در طول اجرای برنامه تغییر کنند.

    قبل از اینکه بتوان از یک ثابت استفاده کرد، باید آن را اعلام کرد. ثابت ها با کلمه کلیدی const و به دنبال آن نام ثابت اعلام می شوند. برای تشخیص ثابت ها از متغیرها در کد برنامه، قرار شد نام ثابت ها با حروف بزرگ نوشته شود:

    Const MAX = 10;

    هنگامی که یک ثابت ایجاد شد، تلاش برای تعریف مجدد آن به یک متغیر یا تلاش برای اختصاص یک مقدار به یک ثابت موجود، باعث خطا می شود.

    چرا متغیرها و ثابت ها مورد نیاز است

    متغیرها و ثابت ها به درک آسان کد کمک می کنند. یک مثال کوچک را در نظر بگیرید:

    مجموع قیمت = 2.42 + 4.33; // قیمت کل

    اعداد اینجا می تواند هر چیزی را معنی کند. برای روشن شدن آنچه در اینجا خلاصه می شود، مقدار 2.42 را می توان به متغیر (یا ثابت) candyPrice (قیمت آب نبات) و 4.33 را به متغیر (یا ثابت) oilPrice (قیمت کره) نسبت داد:

    مجموع قیمت = آب نبات قیمت + روغن قیمت;

    حالا به جای اینکه این مقادیر را به خاطر بسپارید، می بینید که در سناریو، قیمت شیرینی به قیمت کره اضافه می شود.

    همچنین، متغیرها و ثابت ها به صرفه جویی در زمان هنگام اشکال زدایی یک اسکریپت کمک می کنند. به جای استفاده از یک لفظ یکسان در همه جا، می توانید آن را به یک متغیر (یا ثابت) در ابتدای اسکریپت اختصاص دهید و سپس از متغیر (یا ثابت) به جای لفظ در بقیه کدهای اسکریپت استفاده کنید. اگر بعداً تصمیمی برای تغییر مقدار گرفته شود ، تغییرات در کد باید نه در چندین مکان بلکه فقط در یک مکان انجام شود - جایی که به متغیر (یا ثابت) مقدار اختصاص داده شده است.

    محدوده ثابت ها

    قوانین مشابهی برای ثابت ها اعمال می شود که برای متغیرهای اعلام شده با کلمه کلیدی let:

    Const MAX = 5; // ثابت جهانی ( const MAX = 10; // Block console.log ثابت (MAX); // 10 ) console.log(MAX); // 5 foo(); // 15 console.log(MAX); // 5 تابع foo() ( const MAX = 15; // Console.log ثابت محلی (MAX)؛ )

    ثابت ها و انواع مرجع

    هنگامی که یک مقدار از یک نوع مرجع به یک ثابت اختصاص داده می شود، ارجاع به مقدار تغییرناپذیر می شود و خود مقدار برای تغییر در دسترس باقی می ماند:

    Const obj = (a: 5); obj.a = 10; console.log(obj.a); // 10

    از نویسنده:شاید تعجب آور باشد، اما جاوا اسکریپت مدت هاست که از ثابت ها پشتیبانی نمی کند. مقادیر ثبت شده ای که در طول اجرای کل اسکریپت شما تغییر نمی کنند. در غیاب هیچ جایگزینی، اکثر ثابت ها با استفاده از متغیرها اعلام شدند.

    مثالی از اعلام یک ثابت با استفاده از یک متغیر:

    var DAYSINWEEK = 7;

    var DAYSINWEEK = 7 ;

    این هم خطرناک و هم غیرعملی است، زیرا به شما امکان می‌دهد هر زمان که بخواهید مقدار متغیر DAYSINWEEK را در اسکریپت خود تغییر دهید. توسعه‌دهندگان راه‌های مختلفی برای تشخیص متغیرها ارائه کرده‌اند که به‌طور معمول ثابت از متغیرهای معمولی در جاوا اسکریپت هستند، از نام‌گذاری متغیرها با حروف بزرگ (بهترین سنت) تا راه‌حل‌هایی که بعداً در مورد آنها بحث خواهم کرد. خوشبختانه آخرین نسخه ECMAScript (مشخصاتی که استاندارد است) یک ثابت واقعی را معرفی کرد:

    جاوا اسکریپت. شروع سریع

    const DAYSINWEEK = 7;

    const DAYSINWEEK = 7 ;

    و اکنون می توان به DAYSINWEEK مانند یک متغیر دسترسی داشت، اما هرگز نمی توانید مقدار آن را تغییر دهید:

    ورود به سیستم کنسول (DAYSINWEEK)؛ > 7 روز در هفته = 8; > خطا

    کنسول. ورود به سیستم (DAYSINWEEK) ;

    DAYSINWEEK = 8 ;

    > خطا

    هنگامی که یک ثابت اعلام شد (ثابت ها باید با کلمه کلیدی const مقداردهی اولیه شوند و به دنبال آن یک نام ثابت که از قوانین نامگذاری متغیر پیروی می کند)، نام آن رزرو می شود: دیگر نمی توانید یک متغیر DAYSINWEEK را نام ببرید و با این یک ثابت داشته باشید. همین نام یا برعکس

    کلمه کلیدی const در مرورگرهای مدرن پشتیبانی خوبی دارد: IE11 و Spartan، Firefox 31+، Opera 12+، Safari 5.1.7+، iOS 7 و بالاتر، همراه با Chrome 36+. با این حال، چند نکته مهم وجود دارد:

    Chrome از خروجی خطا هنگام تلاش برای بازنویسی یک ثابت پشتیبانی نمی‌کند. مقدار ثابت به هر حال تغییر نخواهد کرد، اما یک توسعه‌دهنده بی‌تجربه ممکن است فکر کند که مقدار جدید از آنجایی که خطایی رخ نداده اعمال شده است.

    جاوا اسکریپت. شروع سریع

    اصول اولیه جاوا اسکریپت را با یک مثال عملی از ساخت اپلیکیشن وب بیاموزید

    ثابت ها محدوده جدیدی در Webkit ایجاد نمی کنند. آن ها ثابت ها می توانند خارج از محدوده فعلی قابل مشاهده باشند.

    فایرفاکس 35 و پایین تر به شما امکان می دهد مقدار یک const را در لحظه تغییر دهید. این مشکل در Firefox 36+ برطرف شده است.

    همچنین لازم به ذکر است که مشکلات Webkit تنها در صورت عدم استفاده از حالت سخت (که در یکی از مقالات بعدی به آن پرداخته خواهد شد) رخ می دهد.

    آیا اکنون می توان از کلمه کلیدی const در پروژه های واقعی استفاده کرد؟

    انتخاب اینکه آیا از کلمه کلیدی const در کد خود استفاده کنید یا نه به عوامل مختلفی بستگی دارد: مهمتر از همه، نسخه های مرورگرهایی که بازدیدکنندگان سایت شما استفاده می کنند، زیرا استفاده از کلمه کلیدی const در مرورگرهایی مانند IE10 به عنوان یک خطا در نظر گرفته می شود. اگر می خواهید از کلمه کلیدی const در حین توسعه استفاده کنید، اما آماده استفاده از آن در پروژه های واقعی نیستید، چندین گزینه دارید:

    گزینه 1: استفاده از ترانسپایلر ("transpiler")

    Transpilers، همانطور که از نام آن پیداست، کد شما را در زمان کامپایل به زبان دیگری تبدیل می‌کند: در این مورد، از نسخه ES6 مشخصات (که کلمه کلیدی const را معرفی کرد) به ES5. این به شما امکان می دهد کد را در نسخه جدیدتر زبان بنویسید، اما پروژه واقعی از نسخه ای استفاده می کند که با طیف وسیع تری از مرورگرها سازگار است. ادی عثمانی تالیف

    در این مقاله نحوه تعیین را یاد خواهید گرفت ثابت ها در جاوا اسکریپت با استفاده از کلمه کلیدی const.

    ES6راه جدیدی برای اعلام ثابت ها با استفاده از کلمه کلیدی ارائه می دهد پایان. کلمه کلیدی پایانیک ارجاع به یک مقدار فقط خواندنی ایجاد می کند.

    Const VARIABLENAME = مقدار;

    با توافق شناسه های ثابت در جاوا اسکریپت با حروف بزرگ هستند.

    کلمه کلیدی پایانبه نظر کلید می رسد بگذار کلمهبه این صورت که متغیرهایی با محدوده بلوک ایجاد می کند، اما مقادیر با آن اعلام می شود const، قابل تغییر نیست.

    متغیرهای اعلام شده با یک کلمه کلیدی اجازه دهیدهستند تغییر پذیر. این بدان معنی است که شما می توانید مقادیر آنها را در هر زمان تغییر دهید، همانطور که در مثال زیر نشان داده شده است.

    اجازه دهید v = 10;
    v = 20;
    v = v + 5;
    ورود به سیستم کنسول (v); // 35

    با این حال، متغیرهایی که با کلمه کلیدی ایجاد می شوند پایان، تغییر ناپذیر هستند. به عبارت دیگر، شما نمی توانید آنها را با مقادیر مختلف دوباره اختصاص دهید. تلاش برای تخصیص مجدد یک متغیر ثابت منجر به یک خطای نوع می شود TypeError .

    مالیات بر هزینه = 0.1;
    مالیات = 0.2 ; // TypeError

    همچنین متغیری که با کلمه کلیدی اعلان می شود نتیجه،باید بلافاصله با یک مقدار مقداردهی اولیه شود. مثال زیر تماس می گیرد اشتباه نوشتاری(خطای نحوی) به دلیل عدم وجود اولیه ساز در اعلام یک متغیر ثابت.

    Const RED; // اشتباه نوشتاری

    همانطور که قبلا ذکر شد، مانند متغیرهای اعلام شده با کلمه کلیدی اجازه دهید، متغیرهای اعلام شده با کلمه کلیدی نتیجه،دارای محدوده بلوک

    این همه است و در مقاله بعدی در مورد استفاده از کلمه کلیدی صحبت خواهیم کرد پایانبا حروف مفعول در جاوا اسکریپت.

    من هم با این مشکل داشتم و پس از مدت‌ها جستجوی پاسخ و بررسی تمام پاسخ‌های همه، فکر می‌کنم به راه‌حلی مناسب برای این موضوع رسیده‌ام.

    به نظر می رسد که اکثر پاسخ هایی که من با آنها مواجه شده ام استفاده از توابع برای نگه داشتن ثابت ها است. همانطور که بسیاری از کاربران بسیاری از انجمن ها در مورد آن پست می کنند، توابع را می توان به راحتی توسط کاربران سمت کلاینت نوشت. من برایم جالب بود. توسط Keith Evetts" پاسخ می دهد که شی ثابت ها توسط خارج قابل دسترسی نیستند، بلکه فقط از توابع داخل قابل دسترسی هستند.

    بنابراین من به این راه حل رسیدم:

    همه چیز را در یک تابع ناشناس قرار دهید، به این ترتیب، متغیرها، اشیاء و غیره. توسط مشتری قابل تغییر نیست. همچنین توابع "واقعی" را با داشتن توابع دیگری که توابع "واقعی" را از داخل فراخوانی می کنند، پنهان کنید. من همچنین به استفاده از توابع برای بررسی اینکه آیا یک تابع توسط یک کاربر در سمت مشتری تغییر کرده است یا خیر، فکر کردم. اگر توابع تغییر کرده اند، آنها را با استفاده از متغیرهایی که در داخل "محافظت شده" هستند و قابل تغییر نیستند، دوباره تغییر دهید.

    /*تست شده در: IE 9.0.8; فایرفاکس 14.0.1; Chrome 20.0.1180.60m; در Safari تست نشده*/ (function()( /*دو تابع _define و _access از مجوز Keith Evetts 2009: LGPL (SETCONST و CONST). نام متغیرها و متن پیام های خطا.*/ //object literal برای نگه داشتن ثابت ها var j = ()؛ /*عملکرد جهانی _define(رشته h، m مخلوط شده). من آن را تعریف کردم تا از روش PHP تقلید کند. ثابت ها را تعریف می کند. آرگومان "h" نام const است و باید یک رشته باشد، "m" مقدار const است و باید وجود داشته باشد. اگر از قبل یک خاصیت با همان نام در دارنده شی وجود داشته باشد. ، سپس یک خطا پرتاب می کنیم. اگر نه، ویژگی را اضافه می کنیم و مقدار آن را تعیین می کنیم. این یک تابع "مخفی" است و کاربر هیچ کدنویسی را نمی بیند که این تابع را فراخوانی کند. شما () _makeDef را در */ self._define = function(h,m) ( if (نوع h !== "string") ( خطای جدید انداخت ("من نمی دانم چه کار کنم."); ) if (!m) (خطای جدید پرتاب کنید("من نمی دانم چه کار کنم."); else (j[h] = m؛ بازگشت true; )); /*تابع جهانی _makeDef(رشته t، مخلوط y). من نام آن را makeDef گذاشتم زیرا با این تابع "تعریف را می سازیم". آرگومان "t" همان نام const و نیازی نیست که تمام حروف بزرگ باشد زیرا من آن را در تابع به حروف بزرگ تنظیم کردم، "y" مقدار مقدار const است و باید وجود داشته باشد. من متغیرهای مختلفی می سازم تا تشخیص اینکه چه اتفاقی در حال رخ دادن است برای کاربر سخت تر می شود. سپس تابع _define را با دو متغیر جدید فراخوانی می کنیم. شما این تابع را در کد خود فراخوانی می کنید تا ثابت را تنظیم کنید. شما می توانید پیام خطا را به هر چیزی که می خواهید بگویید تغییر دهید. */ self._makeDef = تابع (t, y) ( if(!y) (خطای جدید پرتاب ("من نمی دانم چه باید بکنم.")؛ بازگشت نادرست؛ ) q = t.toUpperCase(); w = y؛ _define(q, w); )؛ /*تابع جهانی _getDef(String s). من نام آن را getDef گذاشتم زیرا با این تابع "define" را دریافت می کنیم. آرگومان "s" نام const است و نمی کند "باید تمام حروف بزرگ باشد زیرا من آن را روی حروف بزرگ در تابع تنظیم کردم. من یک متغیر متفاوت می‌سازم تا تشخیص اینکه چه اتفاقی در حال رخ دادن است برای کاربر سخت‌تر می‌شود. تابع فراخوانی تابع _access را برمی گرداند. من متغیر جدید و رشته اصلی را به تابع _access منتقل می کنم. من این کار را به این دلیل انجام می‌دهم که اگر کاربر سعی می‌کند مقدار چیزی را دریافت کند، اگر خطایی وجود داشته باشد، آرگومان با حروف بزرگ در پیام خطا نمایش داده نمی‌شود. شما این تابع را در کد خود فراخوانی می کنید تا ثابت را دریافت کنید. */ self._getDef = تابع(ها) (z = s.toUpperCase(); return _access(z, s); ); /*تابع جهانی _access(رشته g، رشته f). من نام آن را دسترسی گذاشتم زیرا از طریق این تابع به ثابت "دسترسی" می کنیم. آرگومان "g" نام const و تمام حروف بزرگ آن است، "f" نیز نام const است، اما رشته اصلی است که به تابع _getDef() ارسال شده است. اگر خطایی وجود داشته باشد، رشته اصلی، "f" نمایش داده می شود. این کار را برای کاربر سخت تر می کند که بفهمد ثابت ها چگونه ذخیره می شوند. اگر یک ویژگی با همان نام در دارنده شی وجود داشته باشد، مقدار ثابت را برمی گردانیم. اگر نه، بررسی می کنیم که آیا متغیر "f" وجود دارد یا نه، آن را به مقدار "g" تنظیم می کنیم و خطا می دهیم. این یک تابع "مخفی" است و کاربر هیچ کدام از کدنویسی شما را با این تابع نمی بیند. شما تابع _getDef() را در کد خود فراخوانی می کنید و آن تابع این تابع را فراخوانی می کند. می توانید پیام های خطا را به هر چیزی که می خواهید تغییر دهید. */ self._access = تابع (g, f) ( if (نوع g !== "string") (خطای جدید را پرتاب کنید ("من نمی دانم چه کار کنم.")؛ ) if (g in j) ( j[g]; ) else ( if(!f) (f = g; ) خطای جدید انداخت ("نمی دانم چه کنم. نمی دانم \""+f+" \" چیست؟ ."); ) ); /*چهار متغیر زیر خصوصی هستند و از اسکریپت خارجی به جز توابع داخل این تابع ناشناس قابل دسترسی نیستند. این متغیرها رشته هایی از چهار تابع بالا هستند و توسط همه ترسناک استفاده خواهند شد. تابع eval() برای برگرداندن آنها به حالت اصلی خود در صورتی که هر یک از آنها باید توسط کاربری که سعی دارد کد شما را هک کند تغییر دهد. */ var _define_func_string = "function(h,m) ("+" if (نوع h !== "string") (firt new Error("I don\\"n\\"n\\"n\\"t\\"n't know what to do to do."); )"+" if (!m) ( throw new Error("I don\\"t\\"n't\\"t\\"n't know what to do. ")؛ )"+" else if ((h در j)) (خطای جدید را پرتاب کنید("ما مشکل داریم!"); )"+" else ("+" j[h] = m;"+" بازگشت true;" +" )"+" )"; var _makeDef_func_string = "function(t, y) ("+" if(!y) (short new Error("I don\\"n't know what to do."); return false ; )"+" q = t.toUpperCase();"+" w = y;"+" _define(q, w);"+" )"; var _getDef_func_string = "function(s) ("+" z = s.toUpperCase();"+" return _access(z, s);"+" )"; var _access_func_string = "function(g, f) ("+" if (نوع g !== "string") (خطای جدید پرتاب کنید("من نمی دانم چه کار کنم.")"+" اگر (g در j) (بازگرداندن j[g]; )"+" else ( if(!f) (f = g; ) ارور جدید ("من نمی دانم چه کنم. نمی دانم چه کار کنم \\""+f+"\\" است. "); )"+" )"; /*تابع جهانی _doFunctionCheck(String u). من نام آن را doFunctionCheck گذاشتم زیرا ما در حال "بررسی توابع" هستیم. آرگومان "u" نام هر یک از چهار نام تابع بالا است که می خواهید بررسی کنید. اگر اینطور است، ما هیچ کاری انجام نمی دهیم، اگر نه، از تابع ()eval استفاده می کنیم تا تابع را با استفاده از متغیرهای رشته تابع در بالا به کدگذاری اصلی خود برگردانیم. هیچ کدام از کدنویسی خود را با این تابع فراخوانی کنید. شما تابع doCodeCheck() را فراخوانی می کنید و آن تابع این تابع را فراخوانی می کند. - می توانید پیام های خطا را به هر چیزی که می خواهید بگویید تغییر دهید. */ self._doFunctionCheck = function(u) ( var errMsg = "ما یک مشکل بزرگ داریم! شما کد من را تغییر دادید."؛ var doError = true؛ d = u؛ switch(d.toLowerCase()) "_getdef": if(_getDef.toString().indexOf("z = s.toUpperCase();") != -1) ( /*کاری نکنید*/ ) else ( eval("_getDef = "+_getDef_func_string); if(doError === true) (trow new Error(errMsg); ) ) break؛ case "_makedef": if(_makeDef.toString().indexOf("q = t.toUpperCase();") != -1 ) ( /* هیچ کاری نکنید*/ ) other ( eval("_makeDef = "+_makeDef_func_string); if(doError === true) (trow new Error(errMsg); ) ) break؛ case "_define": if(_define. toString().indexOf("else if((h in j))) (") != -1) ( /* هیچ کاری نکنید*/ ) else (eval("_define = "+_define_func_string); if( doError === true) (trow new Error(errMsg)؛ ) ) break؛ case "_access": if(_access.toString().indexOf("else ( if(!f) (f = g;)" ) != -1) ( /*کاری انجام ندهید*/ ) else (eval("_access = "+_access_func_string); if(doError === true) (trow new Error(errMsg); ) ) break؛ پیش فرض: if(doError === true) ( ​​ارور جدید ("من نمی دانم چه کنم."); )))) /*تابع جهانی _doCodeCheck(String v). من نام آن را doCodeCheck گذاشتم زیرا در حال انجام "بررسی کد" هستیم. آرگومان "v" نام یکی از چهار تابع اول در این اسکریپت است که می‌خواهید بررسی کنید. من یک متغیر متفاوت ایجاد می‌کنم تا کار را برای یک اسکریپت سخت‌تر کنم. کاربر برای اینکه بفهمد چه اتفاقی می‌افتد. شما این تابع را در کد خود فراخوانی می‌کنید تا بررسی کنید آیا هر یک از توابع توسط کاربر تغییر کرده است. */ self._doCodeCheck = function(v) (l = v; _doFunctionCheck(l); ;)())

    همچنین به نظر می رسد که امنیت واقعاً یک مشکل است و راهی برای "پنهان کردن" برنامه نویسی شما از سمت مشتری وجود ندارد. یک ایده خوب برای من این است که کد شما را فشرده کنم تا خواندن و درک آن برای هر کسی، از جمله شما، برنامه نویس، واقعا سخت باشد. سایتی وجود دارد که می توانید به آن بروید: http://javascriptcompressor.com/. (این سایت من نیست، نگران نباشید من تبلیغ نمی کنم.) این سایتی است که به شما امکان می دهد کد جاوا اسکریپت را به صورت رایگان فشرده و مبهم کنید.

    1. تمام کدهای موجود در اسکریپت بالا را کپی کرده و در قسمت بالای متن در صفحه javascriptcompressor.com قرار دهید.
    2. چک باکس Base62 encode را علامت بزنید، چک باکس Shrink Variables را علامت بزنید.
    3. دکمه فشرده سازی را فشار دهید.
    4. همه را در یک فایل js قرار داده و ذخیره کنید و آن را به صفحه خود در سر صفحه خود اضافه کنید.