JavaScript هي لغة نصية تدعم الوظائف المتقدمة مثل البرمجة الوظيفية ، والإغلاق ، والميراث القائم على النموذج ، وما إلى ذلك. يبدو أن JavaScript سهلة البدء في البداية ، ولكن مع استخدامها بعمق ، من الصعب في الواقع إتقان JavaScript ، وبعض المفاهيم الأساسية لا تصدق. من بينها ، الكلمة الرئيسية في JavaScript هي مفهوم مربك نسبيا. في سيناريوهات مختلفة ، سيصبح هذا كائنات مختلفة. هناك طريقة عرض أنه من خلال إتقان هذه الكلمة الرئيسية بشكل صحيح في JavaScript ، يمكنك إدخال عتبة لغة JavaScript. في اللغات السائدة الموجهة للكائنات (مثل Java ، C#، إلخ) ، وهذا يعني واضحة ومحددة ، أي الإشارة إلى الكائن الحالي. عموما ملزمة خلال فترة التجميع. يرتبط هذا أثناء وقت التشغيل في JavaScript ، وهو السبب الأساسي في أن هذه الكلمة الرئيسية لها معاني متعددة في JavaScript.
نظرًا لميزة الربط الخاصة بها أثناء وقت التشغيل ، يمكن أن يكون هذا في JavaScript كائنًا عالميًا أو كائنًا حاليًا أو أي كائن ، والذي يعتمد كليا على الطريقة التي تسمى الوظيفة. هناك عدة طرق للاتصال بالوظائف في JavaScript:
تسمى كطريقة كائن ؛
كمكالمة وظيفة ؛
ودعا كمؤسسة.
استخدم التطبيق أو الاتصال للاتصال.
كما يقول المثل ، فإن الشخصية ليست جيدة مثل النموذج ، والشكل ليس جيدًا مثل الصورة. من أجل جعل الناس يفهمون بشكل أفضل ما الذي يشير إليه جافا سكريبت؟ هذه صورة لشرح:
في الصورة أعلاه ، أسميها "JavaScript هذه شجرة القرار" (في الوضع غير الشريطي). فيما يلي مثال لتوضيح كيف يمكن أن يساعدنا هذا الرقم في الحكم على هذا:
var point = {x: 0 ، y: 0 ، moveto: function (x ، y) {this.x = this.x + x ؛ this.y = this.y + y ؛ } ؛ // هذا مرتبط بالكائن الحالي ، أي كائن نقطةهل تسمى دعوة وظيفة moveto مع الجديد؟ من الواضح أن هذا ليس كذلك. الذهاب إلى فرع "لا" ، أي هل تسمى الوظيفة مع DOT (.)؟ ؛
تسمى وظيفة point.moveto مع نقطة (.) ، أي أنها تدخل فرع "نعم" ، أي هذا هو هنا يشير إلى نقطة الكائن قبل point.moveto.
يتم عرض مخطط التحليل لما هذا النقطة في نقطة الشكل.
دعنا نعطي مثالًا آخر ، انظر إلى الكود التالي:
دالة func (x) {this.x = x ؛ } func (5) ؛ // هذه نافذة كائن عالمية ، X هي تحليل Global Variable // Decurity Tree: هل تسمى وظيفة FUNC () الجديدة؟ إلى لا ، هل يطلق عليه مع DOT عند إدخال وظيفة FUNC ()؟ إلى لا ، هذا يشير إلى الكائن العالمي WindowX ؛ // x => 5عملية تحديد وظيفة FUNC () في "JavaScript That Decision Tree" هي كما يلي:
هل استدعاء وظيفة Func (5) مع New؟ من الواضح أن هذا ليس كذلك. الذهاب إلى فرع "لا" ، أي هل تسمى الوظيفة مع DOT (.)؟ ؛
لا يتم استدعاء وظيفة FUNC (5) مع DOT (.) ، أي أنها تدخل فرع "لا" ، أي هذه النقطة إلى النافذة المتغيرة العالمية ، ثم this.x هو في الواقع window.x.
يظهر مخطط التحليل لما تشير إليه وظيفة FUNC هذه في الشكل التالي:
للحصول على طريقة الاتصال مباشرة كدالة ، دعونا نرى مثالًا معقدًا:
var point = {x: 0 ، y: 0 ، moveto: function (x ، y) {// inner function var movex = function (x) {this.x = x ؛ // ماذا هذه النقطة؟ نافذة} ؛ // الوظيفة الداخلية var movey = function (y) {this.y = y ؛ // ماذا هذه النقطة؟ نافذة} ؛ movex (x) ؛ Movey (y) ؛ }} ؛ point.moveto (1،1) ؛ point.x ؛ // => 0 point.y ؛ // => 0 x ؛ // => 1 y ؛ // => 1الدعوة الداخلية الفعلية لوظائف Movex () و Movey (). إن عملية تحديد هذا داخل وظيفة Movex () في "JavaScript هذه شجرة القرار" هي كما يلي:
هل استدعاء وظيفة Movex (1) مع New؟ من الواضح أن هذا ليس كذلك. الذهاب إلى فرع "لا" ، أي هل تسمى الوظيفة مع DOT (.)؟ ؛
لا يتم استدعاء وظيفة Movex (1) باستخدام DOT (.) ، أي أنها تدخل فرع "لا" ، وهذا هو ، وهذا هنا يشير إلى النافذة المتغيرة العالمية ، ثم this.x هو في الواقع window.x.
دعونا نلقي نظرة على مثال مكالمة مُنشئ:
نقطة الوظيفة (x ، y) {this.x = x ؛ // هذا ؟ this.y = y ؛ // this؟} var np = new point (1،1) ؛ np.x ؛ // 1var p = point (2،2) ؛ px ؛ // error ، p هو كائن فارغ undefinedwindow.x ؛ // 2عملية تحديد ذلك في "JavaScript هذه شجرة القرار" في وظيفة النقطة (1،1) هي كما يلي:
var np = new is the point (1،1) call استدعاء مع الجديد؟ من الواضح أن هذا هو إدخال فرع "نعم" ، أي هذا إلى NP ؛
ثم this.x = 1 ، أي np.x = 1 ؛
عملية تحديد ذلك في "JavaScript هذه شجرة القرار" من وظيفة النقطة (2،2) في var p = point (2،2) هي كما يلي:
هل دعوة Var P = Point (2،2) مع New؟ من الواضح أن هذا ليس كذلك. الذهاب إلى فرع "لا" ، أي هل تسمى الوظيفة مع DOT (.)؟ ؛
هل وظيفة (2،2) لا تسمى مع نقطة (.)؟ تم تحديده على أنه لا ، أي أن أدخل فرع "لا" ، أي هذا ، وهذا هنا يشير إلى نافذة المتغير العالمي ، ثم this.x هو في الواقع window.x ؛
this.x = 2 يعني window.x = 2.
أخيرًا ، دعونا نلقي نظرة على مثال الاتصالات بالاتصال بالاتصال والتطبيق:
نقطة الوظيفة (x ، y) {this.x = x ؛ this.y = y ؛ this.moveto = function (x ، y) {this.x = x ؛ this.y = y ؛ }} var p1 = new point (0 ، 0) ؛ var p2 = {x: 0 ، y: 0} ؛ p1.moveto.apply (p2 ، [10 ، 10]) ؛ // تطبيق هو في الواقع p2.moveto (10 ، 10) p2.x // 10إن عملية تحديد الدالة p1.moveto.apply (p2 ، [10،10]) في "JavaScript This Decision Tree" هي كما يلي:
نحن نعلم أن الطريقتين تنطبق والاتصال قويان للغاية ، وأنها تسمح بتبديل سياق تنفيذ الوظيفة ، أي الكائن المرتبط بهذا. p1.moveto.apply (p2 ، [10،10]) هو في الواقع p2.moveto (10،10). ثم يمكن تفسير p2.moveto (10،10) على النحو التالي:
هل تسمى دعوة الوظيفة مع الجديد؟ من الواضح أن هذا ليس كذلك. الذهاب إلى فرع "لا" ، أي هل تسمى الوظيفة مع DOT (.)؟ ؛
تسمى وظيفة p2.moveto (10،10) مع نقطة (.) ، أي أنها تدخل فرع "نعم" ، أي هنا يشير إلى الكائن P2 في p2.moveto (10،10). من قبل ، لذلك p2.x = 10.
فيما يتعلق بعملية بيئة تنفيذ وظائف JavaScript ، فإن الوصف في مكتبة مستندات DeveloperWorks IBM يشعر بالرضا ، والمقتطف هو كما يلي:
"يمكن تنفيذ الوظائف في JavaScript كوظائف عادية أو ككائنات ، وهذا هو السبب الرئيسي وراء حدوث هذا الأمر. عندما يتم تنفيذ وظيفة ، يتم إنشاء بيئة تنفيذ (ExecutionContext) ، وتحدث جميع سلوكيات الوظيفة في بيئة التنفيذ هذه. تهيئة المتغير أولاً ، فإن القيمة المقابلة للسيطات هي القيمة المقابلة للوسائط. سيتم تنفيذ عملية المهمة غير المحددة فقط عند تنفيذ الوظيفة بعد التنفيذ (ExecutionContex). (ExecutionContext) يتم إنشاؤه بنجاح ، وتبدأ الوظيفة في تنفيذ الخط من قبل ، ويتم قراءة المتغيرات المطلوبة من بيئة التنفيذ (ExecutionContext) التي تم بناؤها من قبل. "
سيكون فهم هذا المقطع ذا فائدة كبيرة لفهم وظائف جافا سكريبت.