فهم وحل مشكلة عدم تمرير قيمة حقل الإدخال إلى متغير JavaScript
مقدمة: تحدي تمرير قيم حقول الإدخال إلى JavaScript
يواجه العديد من المطورين، خاصة المبتدئين، تحديًا شائعًا عند محاولة التقاط قيمة من حقل إدخال (input) في صفحة ويب وتمريرها إلى متغير في JavaScript. تخيل السيناريو التالي: لديك حقل إدخال بسيط وزر. عندما يكتب المستخدم نصًا في حقل الإدخال ويضغط على الزر، من المفترض أن يتم تسجيل النص من حقل الإدخال في وحدة التحكم (console).
إليك الكود الأولي الذي قد تبدأ به:
<input id="search" placeholder="Search for...">
<button value='send' id="submit" onclick="myFunction()">Search</button>
<div id="alpha"></div>
function myFunction() {
const test = document.getElementById("search").value;
}
console.log(test);
ولكن عند تحميل الصفحة، تلاحظ ظهور الخطأ في وحدة التحكم. ما الذي يحدث هنا؟ ولماذا لا يمكنك الوصول إلى المتغير Uncaught ReferenceError: test is not defined خارج الدالة test؟ الإجابة تكمن في مفهوم أساسي في JavaScript يُعرف باسم نطاق المتغيرات (Scope).myFunction
نطاق المتغيرات (Scope) في JavaScript: فهم المشكلة الأساسية
السبب الرئيسي لعدم قدرتك على الوصول إلى المتغير خارج الدالة test هو مفهوم النطاق. يمكن وصف النطاق بطريقة أخرى على أنه السياق الذي يتم فيه تعريف المتغيرات والوصول إليها. نظرًا لأن المتغير myFunction تم تعريفه أو إنشاؤه داخل الدالة test، فإنه يكون متاحًا فقط في سياق أو نطاق الدالة myFunction نفسها.myFunction
محاولة تسجيل قيمة خارج test ستؤدي إلى خطأ لأن المتغير غير معرف في ذلك النطاق الخارجي. بعبارة أخرى، المتغير myFunction له نطاق دالة (testfunction scoped)، ولا يمكن الوصول إليه إلا من داخل .myFunction
الحل الفوري: تسجيل القيمة داخل الدالة
أسهل طريقة لمعالجة هذه المشكلة هي تسجيل قيمة من داخل الدالة test نفسها. بهذه الطريقة، في كل مرة يتم فيها الضغط على الزر، سيتم تسجيل القيمة الحالية لحقل الإدخال في وحدة التحكم:myFunction
function myFunction() {
const test = document.getElementById("search").value;
console.log(test);
}
هذا الحل بسيط وفعال إذا كان هدفك هو فقط استخدام القيمة داخل الدالة التي تم تعريفها فيها. ولكن ماذا لو أردت استخدام هذه القيمة في أجزاء أخرى من برنامجك؟
استراتيجيات الوصول إلى قيمة متغير خارج نطاق الدالة
بينما لا يمكن الوصول مباشرة إلى متغير ذي نطاق دالة من خارج الدالة التي تم تعريفه فيها، هناك بعض الطرق لاستخدام قيمة المتغير في بقية أجزاء البرنامج.test
الطريقة الأولى: تخزين القيمة كمتغير عام (Global Variable)
النطاق العام (global scope) هو المستوى الأعلى في برنامجك، خارج جميع الدوال الأخرى. المتغيرات المعرفة في النطاق العام تكون متاحة في جميع أنحاء برنامجك. لذا، فإن إحدى الطرق السهلة لجعل متاحًا في كل مكان هي حفظه كمتغير عام. على سبيل المثال:test
let test = '';
function myFunction() {
test = document.getElementById("search").value;
}
function myOtherFunction() {
console.log(test);
}
بهذه الطريقة، ستتمكن من الوصول إلى قيمة عند استدعاء test. لكن هذا يفترض أن حقل الإدخال يحتوي بالفعل على نص ما، وأن الدالة myOtherFunction، التي تحدد قيمة myFunction، قد تم استدعاؤها قبل test. هذا هو المكان الذي يأتي فيه الفهم القوي لـ JavaScript غير المتزامن (myOtherFunctionasynchronous JavaScript) ليصبح مفيدًا.
الطريقة الثانية: إعادة القيمة من الدالة (Returning the Value)
طريقة أخرى يمكنك من خلالها الوصول إلى المتغير من خارج الدالة الأصلية التي تم تعريفه فيها هي ببساطة إعادته من تلك الدالة. بعد ذلك، عندما تستدعي الدالة من دالة أخرى، سيكون لديك وصول إلى قيمة test.test
يمكنك بعد ذلك إنشاء زر آخر لإلحاق قيمة بالصفحة وربط test بهذا الزر. على سبيل المثال:myOtherFunction
<input id="search" placeholder="Search for...">
<button value='send' id="submit" onclick="myFunction()">Search</button>
<button value='append' id="append" onclick="myOtherFunction()">Append</button>
<div id="alpha"></div>
function myFunction() {
const test = document.getElementById("search").value;
return test;
}
function myOtherFunction() {
const myDiv = document.getElementById("alpha");
myDiv.innerText = myFunction();
}
وهنا مثال عملي يوضح هذه الطريقة:

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