تابع المقالة السابقة "كيفية كتابة رمز JS عالي الجودة" هذه المرة سأقوم بفرز نقاط المعرفة لوظائف JavaScript.
2. استخدام الوظائف
توفر الوظائف المبرمجين مع وظائف تجريدية رئيسية وآليات التنفيذ. يمكن أن تنفذ الوظائف بشكل مستقل ميزات مختلفة متعددة بلغات أخرى ، مثل الإجراءات والأساليب والمشاركات وحتى الفئات أو الوحدات النمطية.
2.1 فهم الاختلافات بين مكالمات الوظائف ومكالمات الأسلوب ومكالمات المنشئ
بالنسبة للبرمجة الموجهة للكائنات ، فإن مُنشئ الوظائف والأساليب والفئات هو ثلاثة مفاهيم مختلفة.
وضع الاستخدام:
1. استدعاء وظيفة
نسخة الكود كما يلي:
وظيفة مرحبا (اسم المستخدم) {
إرجاع "مرحبا" + اسم المستخدم ؛
}
2. استدعاء الطريقة
نسخة الكود كما يلي:
var obj = {
مرحبا: وظيفة () {
إرجاع "مرحبا" ، + this.username ؛
} ،
اسم المستخدم: "فلورالام"
} ؛
Ohj.Hello () ؛ // "Hello ، Floralam"
يرتبط هذا المتغير بالكائن لأنه يتم تعريف طريقة Hello في كائن OBJ. يمكننا أيضًا تعيين نسخة من مرجع الوظيفة نفسه في كائن آخر والحصول على نفس الإجابة.
نسخة الكود كما يلي:
var obj2 = {
مرحبا: obj.hello () ،
اسم المستخدم: "فلورالام"
} ؛
3. استخدم المنشئ
نسخة الكود كما يلي:
مستخدم الوظيفة (الاسم ، passwordhash) {
this.name = name ؛
this.passwordhash = passwordhash ؛
}
يعتبر الاتصال بالمستخدم باستخدام المشغل الجديد مُنشئًا.
نسخة الكود كما يلي:
var u = مستخدم جديد ("floralam" ، "123") ؛
على عكس مكالمات الوظائف ومكالمات الأسلوب ، تأخذ مكالمة المُنشئ كائنًا جديدًا تمامًا حيث أن قيمة هذا المتغير وإرجاع هذا الكائن الجديد ضمنيًا كنتيجة للاتصال. المسئولية الرئيسية للمؤسس هي تهيئة الكائن الجديد.
2.2 يتقن في الوظائف المتقدمة
الوظائف ذات الترتيب العالي ليست أكثر من وظائف تتخذ وظائف كمعلمات أو قيم الإرجاع ، وتستخدم وظائف كمعلمات (عادة ما تسمى وظائف رد الاتصال ، لأن وظائف الترتيب الأعلى "تدعوها لاحقًا") تعتبر تعبيرًا قويًا ومعبرًا ، ويستخدم أيضًا على نطاق واسع في برامج JS.
النظر في طريقة الفرز القياسية للمصفوفات. من أجل العمل في جميع المصفوفات ، تتطلب طريقة الفرز من المتصل أن يقرر كيفية مقارنة أي عنصرين في الصفيف.
نسخة الكود كما يلي:
مقارنة الدالة (x ، y) {
إذا (x <y) {
العودة -1 ؛
}
if (x> y) {
العودة 1 ؛
}
العودة 0 ؛
}
[3،1،4،1،5،9].
نسخة الكود كما يلي:
[3،1،4،1،5،9] .SORT (وظيفة (x ، y) {
إذا (x <y) {
العودة -1 ؛
}
if (x> y) {
العودة 1 ؛
}
العودة 0 ؛
}) ؛ // [1،1،3،4،5،9]
يستخدم المثال أعلاه دالة مجهولة لتبسيطها.
غالبًا ما يؤدي تعلم استخدام وظائف الترتيب العالي إلى تبسيط التعليمات البرمجية والقضاء على رمز الغلاية الشاقة. من أجل التحويل البسيط لمصفوفات السلسلة ، يمكننا استخدام حلقة لتنفيذها مثل هذا:
نسخة الكود كما يلي:
أسماء var = ["Fred" ، "Wilma" ، "Pebbles"] ؛
var apport = [] ؛
لـ (var i = 0 ، n = names.length ؛ i <n ؛ i ++) {
العلوي [i] = أسماء [i] .ToupperCase () ؛
}
العلوي ؛ // ["فريد" ، "ويلما" ، "الحصى"] ؛
باستخدام طريقة الخريطة المريحة للمصفوفات ، يمكنك التخلص من الحلقات وتحويل العناصر واحدة تلو الأخرى باستخدام وظيفة محلية واحدة فقط.
نسخة الكود كما يلي:
أسماء var = ["Fred" ، "Wilma" ، "Pebbles"] ؛
var upper = names.map (function (name) {
return name.ToupperCase () ؛
}) ؛
العلوي ؛ // ["فريد" ، "ويلما" ، "الحصى"] ؛
بالإضافة إلى ذلك ، على سبيل المثال ، نريد إنشاء عدة طرق لإنشاء سلاسل مختلفة مع منطق التنفيذ المشترك ، وتنشئ كل حلقة سلسلة عن طريق توصيل نتائج الحساب لكل جزء مستقل.
نسخة الكود كما يلي:
وظيفة BulidString (N ، رد الاتصال) {
var result = "" ؛
لـ (var i = 0 ؛ i <n ؛ i ++) {
النتيجة += رد الاتصال (i) ؛
}
نتيجة العودة
}
var alphabet = bulidString (26 ، function (i) {
return string.fromcharcode (Aindex + i) ؛
}) ؛
Alphabet ؛ // "ABCDEFGHIJKLMNOPQRXTUVWXYZ" ؛
VAR DIGITS = BuildString (10 ، function (i) {return i ؛})
الأرقام ؛ // "0123456789"
var random = buildString (9 ، function () {
عشوائي += string.fromcharcode (Math.Floor (Math.Random ()*26) +anIndex
}) ؛
عشوائي ؛ // "yefjmcef" (عشوائي)
سيمنح ذلك القراء فهمًا أوضح لما يمكن أن يقوم به الرمز دون تفاصيل التنفيذ المتعمقة.
ملاحظة
تقوم JavaScript بإرجاع صيغة الأرقام العشوائية (بين MNS) للنطاق المحدد: Math.Random ()*(NM)+M
في الوقت نفسه ، انتبه إلى متطلبات السؤال وما إذا كان مطلوبًا إرجاع عدد صحيح إيجابي.
2.3 وضع الاتصال
سيؤدي استدعاء الوظيفة إلى إيقاف تنفيذ الوظيفة الحالية ومرور حقوق التحكم والمعلمات إلى الوظيفة الجديدة. بالإضافة إلى المعلمات الرسمية المحددة في وقت الإعلان ، تتلقى كل وظيفة معلمتين إضافيتين جديدتين: هذا والوسائط.
هذه معلمة مهمة للغاية ، ويتم تحديد قيمتها بواسطة نمط الاتصال.
فيما يلي 4 أنماط استدعاء مهمة جدًا في JavaScript:
أ. نمط الاحتجاج الطريقة
ب. نمط استدعاء الوظيفة
ج. نمط استدعاء المنشئ
د. تطبيق نمط المكالمة نمط الاحتجاج
هناك اختلافات في كيفية تهيئة هذه الأنماط معلمات المفاتيح هذا
1. طريقة الاحتجاج
عندما تكون الوظيفة طريقة لكائن ، نسميها طريقة. عندما يتم استدعاء طريقة ، فإن هذا مرتبط بالكائن المسمى.
نسخة الكود كما يلي:
var myobj = {
فال: 0 ،
الزيادة: وظيفة (inc) {
this.val+= typeof inc === "number"؟ INC: 1 ؛
} ،
get_val: function () {return this.val ؛}
}
myobj.increment () ؛ // 1
myobj ["الزيادة"] (2) ؛ // 3
ملخص:
1. يمكن الحصول على الطريقة التي يمكن بها الحصول على سياق الكائن الذي ينتمون إليه من خلال هذا بطريقة عامة
2. عند استخدام دالة مع. أو التعبير التراجع ، إنه وضع استدعاء الطريقة ، وهذا الكائن مرتبط بالكائن السابق.
3. يمكن للدالة استخدام هذا للوصول إلى كائن ، بحيث يمكنها استرداد قيمة الكائن أو تغيير قيمة الكائن. ربط هذا للكائن يحدث عند استدعاء.
2. نمط استدعاء الوظيفة
عندما لا تكون الدالة خاصية كائن ، فإنها تسمى كدالة. عندما يتم استدعاء وظيفة كنمط استدعاء دالة ، يرتبط هذا بالكائن العالمي. هذا خطأ في تصميم JavaScript ويستمر.
نسخة الكود كما يلي:
وظيفة إضافة (x ، y) {
إرجاع x+y ؛
}
myobj.double = function () {
var that = هذا ؛
var helper = function () {
that.val = add (that.value ، that.value) ؛
// قد تكون الطريقة الخاطئة للكتابة هكذا ، لماذا هو خطأ؟ لأنه عندما يتم استدعاء الوظيفة كدالة داخلية ، فقد كان هذا مرتبطًا بالكائن الخطأ ، ولا يحتوي الكائن العالمي على خاصية VAL ، وبالتالي يتم إرجاع القيمة غير الصحيحة.
//this.val = this.val+this.val ؛
}
المساعد()؛
}
myobj.double () ؛ // 6
3. نمط الاحتجاج المُنشئ
JavaScript هي لغة تستند إلى ميراث النموذج الأولي ، مما يعني أن الكائنات يمكن أن ترث سمات مباشرة من كائنات أخرى ، واللغة غير طبيعية.
إذا اتصلت بوظيفة مع جديدة ، فسوف تحصل على كائن جديد يخفي عضو النموذج الأولي المتصل بالوظيفة ، وسيكون هذا أيضًا مرتبطًا بالكائن الجديد.
البادئة الجديدة أيضًا تغير سلوك بيان العودة. هذه ليست طريقة البرمجة الموصى بها أيضًا.
نسخة الكود كما يلي:
var foo = function (الحالة) {
this.status = الحالة ؛
}
foo.prototype.get_status = function () {
إرجاع this.status ؛
}
// بناء مثيل FOO
var myfoo = new foo ("bar") ؛
myfoo.get_status () ؛ // "بار"
4. تطبيق استدعاء نمط تطبيق الاحتجاج
لأن JavaScript هي لغة وظيفية موجهة نحو الكائن ، يمكن أن يكون للوظائف طرق.
طريقة التطبيق لها معلمتان. الأول هو ربط القيمة بهذا ، والثاني هو صفيف المعلمة. بمعنى أن طريقة التطبيق تتيح لنا إنشاء صفيف واستخدامها للاتصال بالوظيفة ، والتي تتيح لنا تحديد قيمة هذا ويسمح لنا أيضًا بتحديد قيمة الصفيف.
نسخة الكود كما يلي:
var Array = [3،4] ؛
var sum = add.apply (null ، array) ؛ // 7
var stationObj = {status: "ABCDEFG"} ؛
foo.prototype.pro_get_status = دالة (بادئة) {
PROTTER PROMIX +"-" +this.status ؛
}
var status = foo.prototype.get_status.apply (stationObj) ؛ // "ABCDEFG"
var pro_status = foo.prototype.get_status.apply (stationObj ، ["prefix"]) ؛ // "prefix -abcdefg"
عادةً ما يتم تحديد جهاز استقبال وظيفة أو طريقة (مستوى مرتبط بقيمة هذه الكلمة الرئيسية الخاصة) بواسطة بناء جملة المتصل. على وجه الخصوص ، يربط بناء جملة استدعاء الطريقة الطريقة لهذا المتغير بواسطة كائن البحث. ومع ذلك ، في بعض الأحيان يكون من الضروري استدعاء وظائف باستخدام جهاز استقبال مخصص. في هذا الوقت ، تحتاج إلى استخدام طريقة الاتصال أو طريقة الربط لتخصيص المتلقي لاستدعاء الطريقة
2.4 استخراج الطرق مع تعريف المستلمين باستخدام طريقة ربط
نظرًا لأن الطريقة لا تختلف عن السمات التي تكون قيمها وظائف ، فمن السهل أيضًا استخراج طريقة الكائن واستخراج الوظيفة كدالة رد الاتصال وتمريرها مباشرة إلى وظيفة الترتيب العالي.
ولكن من السهل أيضًا أن ننسى ربط الوظيفة المستخرجة بالكائن المستخرج.
نسخة الكود كما يلي:
var buffer = {
إدخالات: [] ،
إضافة: الوظيفة (s) {
this.entries.push (s) ؛
}
}
var source = ["867" ، "-" ، "5309"] ؛
Source.foreach (butter.add) ؛ // error: الإدخالات غير محددة
في هذا الوقت ، لم يكن مستلم Butter.Add هو كائن الزبدة. يعتمد جهاز استقبال الوظيفة على كيفية استدعاءها ، ويتم استدعاء طريقة foreach في النطاق العالمي ، وبالتالي فإن تنفيذ طريقة foreach يستخدم الكائن العالمي كمستقبل افتراضي. نظرًا لعدم وجود سمة إدخالات في الكائن العالمي ، يلقي هذا الرمز خطأ.
تتيح طريقة foreach للمتصل تقديم معلمة اختيارية كمستقبل لوظيفة رد الاتصال.
نسخة الكود كما يلي:
var source = ["867" ، "-" ، "5309"] ؛
Source.foreach (butter.add ، butter) ؛
ولكن ليست جميع وظائف الترتيب العالي حذرين ومدروسة لتزويد المستخدمين بمستقبل وظائف رد الاتصال.
هناك حلان:
1) إنشاء طريقة كائن عازلة صريحة لاستدعاء وظيفة التغليف. بغض النظر عن كيفية استدعاء وظيفة التغليف ، فإنه يضمن دائمًا دفع معلماتها إلى صفيف الهدف.
نسخة الكود كما يلي:
var source = ["867" ، "-" ، "5309"] ؛
Source.foreach (الوظيفة (S) {
butter.add (s) ؛
}) ؛
2) تتطلب طريقة الربط لكائن الوظيفة كائن مستقبل وينشئ وظيفة تغليف تستدعي الوظيفة الأصلية بالطريقة التي يطلق عليها كائن الاستقبال.
نسخة الكود كما يلي:
var source = ["867" ، "-" ، "5309"] ؛
Source.foreach (butter.add.bind (Buffer)) ؛
ملاحظة
Buffer.add.bind (Buffer) ينشئ وظيفة جديدة بدلاً من تعديل وظيفة buffer.add:
buffer.add === Buffer.Add.Bind (Buffer) ؛ //خطأ شنيع
ما سبق هو كل شيء عن هذا المقال ، أتمنى أن تنال إعجابك.