يمكن أن تكون الكلمة الأساسية this في JavaScript مربكة لأنها تتصرف بشكل مختلف في الوظائف العادية ووظائف الأسهم. في منشور المدونة هذا، سنشرح كيفية عمل ذلك في كلا النوعين من الوظائف، ونستكشف سبب وجود هذه الاختلافات، ونقدم المعرفة الأساسية التي تحتاجها لفهم ذلك في JavaScript.
يتم تعريف الوظائف العادية في JavaScript باستخدام الكلمة الأساسية للوظيفة. تعتمد قيمة هذا في هذه الوظائف على كيفية استدعاء الوظيفة. وإليكم عدة أمثلة:
function regularFunction() { console.log(this); } regularFunction(); // Logs the global object (window in browsers)
شرح: في الوضع غير الصارم، عندما يتم استدعاء دالة في السياق العام (وليس كطريقة للكائن)، يشير هذا إلى الكائن العام (نافذة في المتصفحات أو عمومي في العقدة .js).
'use strict'; function regularFunction() { console.log(this); } regularFunction(); // Logs undefined
عندما يتم استدعاء دالة كطريقة لكائن ما، فهذا يشير إلى ذلك الكائن.
const obj = { method: function() { console.log(this); } }; obj.method(); // Logs obj
شرح: في هذه الحالة، يشير هذا إلى obj لأن الوظيفة تسمى كطريقة لـ obj.
عند استخدام دالة كمنشئ (يتم استدعاؤها باستخدام الكلمة الأساسية الجديدة)، يشير هذا إلى المثيل الذي تم إنشاؤه حديثًا.
function Person(name) { this.name = name; this.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; } const person1 = new Person('Alice'); person1.sayHello(); // Logs "Hello, my name is Alice" const person2 = new Person('Bob'); person2.sayHello(); // Logs "Hello, my name is Bob"
شرح: عند الاتصال بـ new، يشير هذا الموجود داخل وظيفة مُنشئ الشخص إلى المثيل الجديد الذي يتم إنشاؤه. يحصل كل مثيل جديد (person1 وperson2) على خاصية الاسم الخاصة به وطريقة sayHello.
يمكنك ربط هذا بشكل صريح باستخدام الاتصال أو التطبيق أو الربط.
function regularFunction() { console.log(this); } const obj = { value: 42 }; regularFunction.call(obj); // Logs obj regularFunction.apply(obj); // Logs obj const boundFunction = regularFunction.bind(obj); boundFunction(); // Logs obj
شرح: استدعاء وتطبيق على الفور استدعاء الوظيفة مع هذه المجموعة إلى obj، بينما يقوم bind بإنشاء وظيفة جديدة مع هذا المرتبط بشكل دائم بـ obj.
وظائف السهم، المقدمة في ES6، ليس لها هذا السياق الخاص بها. وبدلاً من ذلك، فهم يرثون هذا من النطاق (المعجمي) المحيط. وهذا يجعل وظائف السهم مفيدة في مواقف معينة.
ترث وظائف السهم هذا من النطاق الذي تم تعريفها فيه.
const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs the global object (window in browsers)
شرح: وظائف السهم ليس لها هذا؛ يستخدمون هذا من النطاق المحيط. يشير هنا إلى الكائن العام لأن الوظيفة محددة في النطاق العالمي.
'use strict'; const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs undefined
على عكس الوظائف العادية، لا تحصل وظائف الأسهم على وظائفها الخاصة عند استدعائها كطرق. إنهم يرثون هذا من النطاق المرفق.
const obj = { method: () => { console.log(this); } }; obj.method(); // Logs the global object (window in browsers) or undefined in strict mode
شرح: لا تربط وظائف السهم بهذا ولكنها ترثه من النطاق المعجمي. في هذا المثال، يشير هذا إلى الكائن العام أو غير المحدد في الوضع الصارم، وليس الكائن.
عندما يتم تعريف دالة سهمية داخل دالة أخرى، فإنها ترث ذلك من الدالة الخارجية.
function outerFunction() { const arrowFunction = () => { console.log(this); }; arrowFunction(); } const obj = { value: 42, outerFunction: outerFunction }; obj.outerFunction(); // Logs obj, because `this` in arrowFunction is inherited from outerFunction
شرح: في هذه الحالة، يشير هذا داخل وظيفة السهم إلى نفس هذا كما في الوظيفة الخارجية، وهو obj.
ترث وظائف الأسهم في معالجات الأحداث هذا من النطاق المعجمي المحيط، وليس من العنصر الذي يطلق الحدث.
const button = document.querySelector('button'); button.addEventListener('click', () => { console.log(this); }); // Logs the global object (window in browsers) or undefined in strict mode
شرح: وظيفة السهم لا تربط هذا بعنصر الزر؛ يرثها من النطاق المحيط، وهو النطاق العالمي أو غير المحدد في الوضع الصارم.
يكمن الفرق بين الوظائف العادية ووظائف الأسهم في كيفية التعامل مع هذا:
لفهم سلوك ذلك في جافا سكريبت، تحتاج إلى معرفة المفاهيم التالية:
سيساعدك فهم هذه الفروق في كتابة كود JavaScript أكثر قابلية للتنبؤ والصيانة. سواء كنت تستخدم وظائف عادية أو وظائف أسهم، فإن معرفة كيفية عمل ذلك أمر بالغ الأهمية لتطوير جافا سكريبت بشكل فعال.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3