ما هو الفرق الفعلي بين "رد وظيفة" و "وظيفة طبيعية"؟


الاجابه 1:

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

function logElementText (eventOrElement) {if (! eventOrElement) {throw new RefernceError ('No event or element given.')؛ } if (eventOrElement.target) {// تم تمرير كائن حدث. console.log (eventOrElement.target.textContent)؛ } تم تمرير عنصر آخر {/ افترض. console.log (eventOrElement.textContent)؛ }} var button = document.querySelector ('button')؛ // يمكننا استخدام logElementText كرد اتصال: button.addEventListener ('click'، logElementText)؛ // أو يمكننا استدعاء الوظيفة مباشرة: logElementText (زر) ؛

لاحظ كيف يمكننا إما تمرير logElementText كرد اتصال عبر addEventListener ، وفي هذه الحالة يتم تنفيذه عند حدوث حدث نقرة على الزر ، أو يمكننا فقط استدعاء الوظيفة مباشرة وتمريرها كعنصر ، حيث إنه مكتوب حتى يتمكن من التعامل مع كليهما .

في هذه الحالة ، تم تنفيذ رد الاتصال بواسطة آلية التعامل مع الأحداث في المتصفح ، ولكن يمكننا أيضًا القيام بذلك بأنفسنا:

وظيفة loadSomeData (عنوان url ، رد الاتصال) {if (! url) {رمي مرجع جديد ('لم يتم توفير عنوان URL') ؛ } if (! callback || typeof callback! == 'function') {رمي TypeError الجديد ('Callback ليس وظيفة')؛ } var xhr = new XMLHttpRequest ()؛ xhr.open ('GET'، url، true)؛ xhr.onload = function () {if (xhr.status <400) {// هنا ننفذ رد الاتصال المقدم. الاستدعاء (xhr.response)؛ } آخر {console.log ('يا عزيزي ، حدث خطأ ما :(') ؛ console.log (xhr.statusText) ؛}} xhr.send () ؛} function displayData (data) {console.log (data)؛ } loadSomeData ('/ fetch-data؟ format = json' ، displayData) ؛ displayData ({firstName: 'Andy' ، اسم العائلة: 'Farrell' ، الموقع: 'England' ، الهوايات: ['Photography' ، 'تطوير البرمجيات'] })؛

ترى كيف على السطر 15 ندعو ببساطة المعلمة رد الاتصال كما لو كانت وظيفة؟ لاحظ أيضًا على السطر 5 أننا نتخذ بعض الإجراءات الدفاعية لضمان أن وظيفة معاودة الاتصال هي في الواقع وظيفة.

أخيرًا ، غالبًا ما يتم توفير عمليات الاسترجاعات كدالات مجهولة ، بمعنى آخر ، الدالات التي ليس لها اسم ويتم تمريرها في السطر ، مثل هذا:

loadSomeData ('/ fetch-data؟ format = text' ، دالة (data) {var upperCased = data.toUpperCase () ؛ console.log (upperCased)؛})؛

هنا ، بدلاً من توفير وظيفة موجودة كمعلمة ثانية لتحميل loadSomeData ، نحن نوفر وظيفة مجهولة مباشرة ؛ بمعنى آخر ، نحن نقدم دالة حرفية ، تمامًا مثل الطريقة التي قدمنا ​​بها في المثال السابق كائنًا حرفيًا لوظيفة displayData في السطر 31.

السبب في كل هذا هو أنه في وظائف JavaScript هي كائنات من الدرجة الأولى ، وبعبارة أخرى أنها تشبه أي كائن آخر: يمكنك تعيين متغير لتكون وظيفة ، يمكن أن يكون للوظيفة خصائص وطرق (مثل الاتصال والتطبيق ) ، ويمكنك تمريرها كمعلمات إلى وظائف أخرى.


الاجابه 2:

رد وظيفة: إذا كنت ترغب في القيام ببعض العمليات في بعض الأحداث

مثل وقت العرض على نقرة زر واحدة.

ثم يمكنك تجاوز وظيفة onclick لهذا الزر.

لذلك عندما يتم النقر على هذا الزر (مستقل في الوقت المحدد) ، سيتصل إطار العمل الداخلي للتطبيق بالحدث onclick وسيتم استدعاء وظيفة onclick الخاصة بك.

وظيفة طبيعية: كل وظيفة هي وظيفة طبيعية.