this يتم تحديده بناءً على كيفية استدعاء الدالة، وليس حيث يتم تعريفها. هناك خمس قواعد:
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this يتم تحديده بناءً على كيفية استدعاء الدالة، وليس حيث يتم تعريفها. هناك خمس قواعد:
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
الدوال السهمية لا تملك this خاص بها — فهي ترثه من النطاق المحيط وقت التعريف. هذا هو السبب في أن الأسهم مثالية للدوال الاستدعاء:
const obj = {
items: [1, 2],
logAll() {
// ✅ arrow inherits `this` from logAll → `this` is obj
this.items.forEach(i => console.log(this.items, i));
// ❌ a regular function here would have its own `this` (undefined) → crash
// this.items.forEach(function (i) { console.log(this.items); });
},
};
تمرير دالة كدالة استدعاء يفقد ربطها، لأنها يتم استدعاؤها بشكل عادي بعد ذلك:
button.addEventListener("click", obj.getX); // ❌ `this` is the button
button.addEventListener("click", () => obj.getX()); // ✅ keeps obj
button.addEventListener("click", obj.getX.bind(obj)); // ✅ also fine
سوء الفهم حول this هو أحد أكثر الأخطاء شيوعاً في JavaScript.
الحل عادة ما يكون دالة سهمية أو .bind() لتقفيل this المقصود.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع