في المفاهيم التقليدية ، يُعتقد أن وظائف JavaScript تمر مرجع مرجع (تسمى أيضًا تمرير المؤشر) ، ويعتقد بعض الناس أن كل من تمرير القيمة والمرجع المتاح. إذن ما الذي يجري مع مرور معلمة JS؟ في الواقع ، يمكن استخدام العرض التوضيحي التالي في Java
أولاً ، دعنا نحصل على نوع أسهل أساسي من التسليم:
وظيفة إضافة (num) {num+= 10 ؛ return num ؛} num = 10 ؛ ALERT (add (num)) ؛ aelrt (num) ؛ // output 20،10بالنسبة إلى المخرجات 20 و 10 هنا ، وفقًا للشرح الرسمي لـ JS ، يتم إجراء إجراء نسخ عند تمرير معلمات النوع الأساسية ، بحيث يكون للمتغير المتغير المعلن خارجيًا ومعلمة الوظيفة نفس القيمة تمامًا ، ولكن لها عناوين معلمة مختلفة تمامًا. لا أحد يعرف بعضنا البعض ، ويظهر إطار مكدس المعلمة الدالة عند إرجاع استدعاء الوظيفة. لذلك ، فإن تغيير معلمة الوظيفة ليس له أي تأثير على المتغيرات الخارجية الأصلية.
دعونا نلقي نظرة على تمريرة نوع مرجع أكثر تعقيدًا:
الدالة setName (obj) {obj.name = "ted" ؛} var obj = new Object () ؛ setName (obj) ؛ Alert (obj.name) ؛ // output tedجوهر الكود أعلاه هو: إنشاء كائن كائن ، قم بتعيينه إلى OBJ (في C ، هو مباشرة تعيين لعنوان الذاكرة) ، وبعد ذلك عند تمرير معلمات الوظيفة ، فعلت نفس الشيء مثل الطريقة السابقة ، نسخت إطار مكدس إلى OBJ معلمة الوظيفة ، وكلاهما يكون له نفس القيمة (قد يكون مفهوماً ككائن الكائن) ، ثم عند تغيير المجموعة. Java) ، وبعد الانتهاء من التغيير ، يجب أيضًا ظهر إطار المكدس الذي يتوافق مع معلمة الوظيفة OBJ.
لذلك ، فإن الإخراج المقابل هو قيمة كائن الكائن بعد التغيير
ثم قد يسأل بعض الأصدقاء ، يمكن أيضًا فهم ذلك على أنه تمريرة مرجعية (تمريرة مؤشر)؟ لا ، بالمعنى الدقيق للكلمة ، بلغات مماثلة لجافا ، لا توجد مؤشرات. في Java ، تسمى العملية أعلاه عملية التحليل من المرجع الرمزي إلى المرجع المباشر. في C ، يكون المؤشر نوعًا ذو طول ثابت (2 بايت في معظم المترجمين C) ، ولكن في اللغات المماثلة في Java ، فإن المراجع لها أيضًا خصائص وطرق خاصة بها ، لكن لا يمكنك الوصول إليها مباشرةً والتحكم فيها ، لذلك فهي أيضًا كائن بمعنى ما. تتجنب هذه الآلية أيضًا تسرب الذاكرة بشكل كبير ، ويسمى المصطلح آلية الوصول المنظمة للذاكرة.
لإثبات النقطة المذكورة أعلاه ، يتم تعديل المثال أعلاه قليلاً:
وظيفة setName (obj) {obj.name = "ted" ؛ OBJ = كائن جديد () ؛ obj.name = "mary" ؛} var obj = new Object () ؛ setName (OBJ) ؛ ALERT (OBJ.NAME) ؛ // إخراج TEDالفرق الوحيد بين هذا المثال والمثال السابق هو أن كائن جديد يتم تعيينه إلى معلمة الوظيفة OBJ ، بحيث يكون لدى معلمة الوظيفة OBJ ومعلمة OBJ المرجعية الأصلية قيمًا وعناوين ذاكرة مختلفة تمامًا.
تتحدث المقالة أعلاه بإيجاز حول ما إذا كانت معلمة وظيفة JavaScript هي تمرير القيمة أو مرجع مرجع هو كل المحتوى الذي شاركته معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.