دعونا هو فار الجديد



عندما نتعلم لغة برمجة ، تظهر عدة مفاهيم أساسية ، مثل إعلان المتغيرات ، وهي بسيطة للغاية بحيث يمكننا البدء في استخدامها دون أي معرفة بأدائها.

أعرف ما الذي فكرت به: "لماذا تهدرون وقتاً في الكتابة إلينا حول هذا؟"

لأنني أعتقد أن الأمر يستحق قضاء بضع دقائق لفهم هذه العناصر بشكل أفضل ، وما هو معناها وكيف ينبغي لنا استخدامها. هذا سيساعدك على تجنب بعض الأخطاء الشائعة وكتابة التعليمات البرمجية بشكل أفضل.

في هذه المقالة ، سوف نركز على كيفية تخزين البيانات في JavaScript.

فار


"ذات مرة في مجرة ​​بعيدة ..." كان الخيار الوحيد لتعريف المتغيرات في JavaScript هو استخدام الكلمة var ، وكان ذلك كافيًا لإدارة البيانات في الكود. ولكن مع إدخال المعيار ES6 ، أصبحت بعض الشذوذ والضعف في JS القديم واضحة إلى حد ما:

  1. النطاق: الكلمة الرئيسية var تسمح لك بتحديد المتغيرات فقط في النطاق العام والمحلي (أو في نطاق الوظيفة). بغض النظر عن عدد الكتل المتداخلة من التعليمات البرمجية لديك ، لا يوجد سوى هذين الاحتمالين.
  2. الثوابت: إذا كنت تريد تحديد شيء لن يتغير أثناء تنفيذ التعليمات البرمجية ، يمكنك الاعتماد فقط على الحس السليم للمطورين. يمكننا استخدام بعض المصطلحات المفيدة لتوضيح المعنى (على سبيل المثال ، الحروف الكبيرة) ، ولكن لا يوجد شيء يضمن عدم تغير المعنى.
  3. Overriding Variables: يمكنك تكرار إعلان نفس المتغير عدة مرات كما تريد (في نفس النطاق) ، وهذا أمر مربك قليلاً إذا كنت تريد الحفاظ على المتغيرات فريدة من نوعها.

حدد


قبل البدء بالأشياء التقنية ، دعنا نقدم بعض التعريفات العامة:

المتغير عبارة عن "حاوية" يتم فيها تخزين البيانات القابلة لإعادة الاستخدام (تافهة جدًا).

المعرّفات أسماء متغيرة (أيضًا تافهة جدًا).

الكتلة هي جزء من الكود مفصولة بزوج من الأقواس المتعرجة ( ccskrf ) ، على سبيل المثال: if ، for ، و ، و. ر. د.

النطاق ، يحدد مدى رؤية المتغيرات داخل الكود. إذا كانت لديك أي شكوك ، اسأل نفسك: "أين المتغير الخاص بي مرئي في الكود؟"
ملاحظة. يرجى عدم الخلط بين النطاق وسياق التنفيذ ، وهو أمر مختلف.

** السياق (أو سياق التنفيذ) ** هو البيئة التي يتم فيها تنفيذ شفرة JavaScript. للبساطة ، يمكننا أن نقول أن السياق هو الكائن الذي ينتمي إليه الرمز ، وهذه هي الكلمة الأساسية التي تشير إليه. لذا اسأل نفسك: "ما الشيء الذي يشير إليه هذا؟"

لنفترض الآن أن المطور لدينا متحمس جدًا بشأن حرب النجوم (وهو أمر جيد) ، لكنه يشك في وجود معايير جديدة مثل ES6 (وهو أمر سيء) ، على الرغم من أنه ظل موجودًا لبعض الوقت. لذلك ، يفضل كتابة الكود الخاص به في نمط ES5 القديم ، وسيبدو كما يلي:

console.log("I am a %s", jedi); var jedi = "Ani"; //   jedi    // =>  undefined function useTheForce(comeToTheDarkSide) { var jedi = "Obi-Wan Kenobi"; var jedi = "Anakin Skywalker"; if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // => I am Darth Vader } console.log("I am %s", jedi); //  Darth Vader } useTheForce(true); console.log("I am %s", jedi); // => Ani 

كما ترون ، هناك ثلاث كتل من التعليمات البرمجية (بما في ذلك العالمية) ، ولكن اثنين فقط من النطاقات. وذلك لأن الكود الموجود في حالة عدم قيام الأقواس بإنشاء نطاق. ستصدر وحدة التحكم "أنا دارث فيدر" مرتين ، ثم "أنا عاني" على مستوى العالم.

لاحظ أيضًا أن المتغير نفسه يتم الإعلان عنه مرتين على التوالي داخل الوظيفة ، ثم مرة أخرى في عبارة if. هذا يعني أن لدينا إعلانًا عن نفس المتغير في نفس النطاق ثلاث مرات ، وهو ما يلقي استثناءً.

أخيرًا وليس آخرًا ، إخراج السجل الأول هو: نقوم بطباعة قيمة المتغير الخاص بنا قبل تحديده. هذا قانوني تمامًا مع var ويسمى "الرفع".

يفترض "الصعود" أن المتغيرات والوظائف المعلنة قد تم نقلها فعليًا إلى بداية الكود. من الناحية الفنية ، هناك تعريفات للمتغيرات والوظائف المخزنة في الذاكرة في مرحلة الترجمة ، لكن تبقى في الكود بالضبط حيث كتبت بها. تكمن الأهمية الأساسية للرافعة في أنه يتيح لك استخدام الوظائف قبل إعلانها في الكود.

يمكنك أن تقرأ عنها هنا .

في مثالنا ، يتم وضع إعلان المتغير "jedi" في الذاكرة وتهيئته إلى القيمة الافتراضية (غير محددة).

سمح


في الوقت الحالي ، يدرك مطورنا أن ES6 ليس سيئًا للغاية ، وأنه يقرر منح فرصة:

 console.log("I am a %s", jedi); let jedi = "Ani"; //   jedi    // => Uncaught ReferenceError:     "jedi"   function useTheForce(comeToTheDarkSide) { let jedi = "Obi-Wan Kenobi"; let jedi = "Anakin Skywalker"; // => Uncaught SyntaxError:  ''   if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // =>  Darth Vader } console.log("I am %s", jedi); //  Anakim Skywalker } useTheForce(true); console.log("I am %s", jedi); // =>  Ani 

لكنه سرعان ما يدرك أنه لا يمكنه تغيير الكلمة الرئيسية var للسماح بها ، لذلك عليك إجراء بعض التصحيحات:

لا يعمل الارتفاع بنفس الطريقة: يتم وضع متغير في حالة تسمى Temporal Dead Zone * * ولا تتم تهيئته حتى يتم تقييم التعريف. في مثالنا ، فإنه يلقي خطأ: خطأ مرجعي.

إعادة التعيين محظورة ، يجب أن يكون تعريف المتغير في النطاق فريدًا. عند محاولة الحصول على خطأ: SyntaxError.

عبارة if هي نطاق كتلة صالح ، وبالتالي فإن إعلان jedi بداخله فريد من نوعه.

الآن يجب أن يكون الرمز مثل هذا:

 let jedi = "Ani"; console.log("I am a %s", jedi); // print jedi variable before defining it // =>  Ani (  ) : 0 function useTheForce(comeToTheDarkSide) { let jedi = "Obi-Wan Kenobi"; let jedi = "Anakin Skywalker"; if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // =>  Darth Vader } console.log("I am %s", jedi); //  Anakim Skywalker } useTheForce(true); console.log("I am %s", jedi); 

CONST


الآن بعد أن عرفت كل شيء عن ذلك ، سيكون من السهل تقديمك إلى const . في جوهرها ، يمكننا أن نقول أن const يشبه السماح ، ولكن لا يمكنك إعادة تعيين قيمة أخرى. تحتاج أيضًا إلى معرفة أن التعيين مسموح به فقط خلال إعلانات const.

 function useTheForce(comeToTheDarkSide) { const jedi = "Yoda"; if (true) { jedi = "Darth Yoda"; console.log("I am %s", jedi); // => TypeError: Assignement to constant variable. } } useTheForce(true); 

لنفترض أنه في مثالنا ، "jedi" هو ثابت مع القيمة "Yoda" ، إذا حاولنا تغيير القيمة داخل عبارة if ، فسوف يعطينا خطأ TypeError ، وهذا أمر مفهوم لأن Yoda لن تنضم أبدًا إلى الجانب المظلم.

استنتاج


عندما يكون من المستحيل التعبير عن مفهوم بالكلمات باللغات ، يتم تقديم مفهوم جديد لسد الفجوة. هذا صحيح بالنسبة للغة الإنجليزية ( link. ) ، والإيطالية ، والإسبرانتو ، والأويوكي (أفترض) ، وما إلى ذلك. وهذا صحيح بالنسبة للغات البرمجة مثل JavaScript.

أنت تعرف الآن أنه يمكنك:

  • قم بتعريف المتغيرات في نطاق الكتلة وتخصيص الذاكرة لهم فقط عند تقييم الكتلة
  • حافظ على الإعلانات المتغيرة فريدة من نوعها داخل النطاق ، مع تجنب أن يتخطى المطور عن طريق الخطأ المتغير المستخدم في جزء آخر من الشفرة (بقيمة مختلفة)
  • يمكننا التأكد من أن المتغير المخزن في const لن يتغير في أي وقت.

نصيحتي الأخيرة هي استخدام const كخيار افتراضي لك. عندما تحتاج إلى إعادة تعيين متغير ، استخدم ** let ** (كما في الحلقات). واستخدم var عندما ... لا ، لم تعد بحاجة إلى var ، حقًا

شكرا لاهتمامكم

أسئلة جافا سكريبت سريعة

أنا على تويتر و كيه

Source: https://habr.com/ru/post/ar466559/


All Articles