يقدم
تقدم هذه المقالة بشكل أساسي بعض التقنيات المستخدمة في الوظيفة (الجزء 1). باستخدام ميزات الوظيفة ، يمكنك كتابة الكثير من التعليمات البرمجية المثيرة للاهتمام. تتضمن هذه المقالة أساسًا: وضع رد الاتصال ، وكائن التكوين ، ووظيفة الإرجاع ، وبرنامج التوزيع ، والكاري.
وظيفة رد الاتصال
في JavaScript ، عندما تكون الدالة A واحدة من معلمات وظيفة أخرى B ، تسمى الوظيفة A وظيفة رد الاتصال ، أي ، يمكن تنفيذ A في فترة الوظيفة B (كل من البداية ، المتوسطة ، والنهاية).
على سبيل المثال ، هناك وظيفة تنشئ العقد
نسخة الكود كما يلي:
var complexComputation = function () { /* handle intorial و retring a node* /} ؛
يوجد إعلان وظيفة FindNodes للعثور على جميع العقد ثم تنفيذ الرمز من خلال رد الاتصال على رد الاتصال.
نسخة الكود كما يلي:
var findnodes = function (callback) {
VAR العقد = [] ؛
var node = complexComputation () ؛
// إذا كانت وظيفة رد الاتصال متوفرة ، فقم بتنفيذها
إذا (typeof callback === "وظيفة") {
رد الاتصال (العقدة) ؛
}
العقد. push (العقدة) ؛
إرجاع العقد
} ؛
فيما يتعلق بتعريف رد الاتصال ، يمكننا تحديده مسبقًا للاستخدام:
نسخة الكود كما يلي:
// تحديد رد الاتصال
var hide = function (node) {
node.style.display = "none" ؛
} ؛
// ابحث عن العقد وإخفاء جميع العقد
var hiddennodes = findNodes (إخفاء) ؛
يمكنك أيضًا استخدام تعريفات مجهولة مباشرة عند الاتصال ، على النحو التالي:
نسخة الكود كما يلي:
// استخدم وظائف مجهولة لتحديد رد الاتصال
var blocknodes = findNodes (function (node) {
node.style.display = 'block' ؛
}) ؛
من المحتمل أن تكون تلك الأكثر استخدامًا هي المكالمات إلى طريقة AJAX الخاصة بـ JQuery. عن طريق تحديد رد الاتصال على Done/Faild ، يمكننا مزيد من المعالجة عندما تنجح مكالمة Ajax أو تفشل. الرمز كما يلي (يعتمد هذا الرمز على jQuery الإصدار 1.8):
نسخة الكود كما يلي:
var menuid = $ ("ul.nav"). first (). attr ("id") ؛
طلب var = $ .ajax ({
عنوان URL: "script.php" ،
النوع: "بعد" ،
البيانات: {id: menuid} ،
نوع البيانات: "HTML"
}) ؛
// معالجة رد الاتصال عندما تكون المكالمة ناجحة
request.done (وظيفة (msg) {
$ ("#log"). html (msg) ؛
}) ؛
// معالجة رد الاتصال عند فشل المكالمة
طلب.
تنبيه ("فشل الطلب:" + TextStatus) ؛
}) ؛
كائنات التكوين
إذا كانت معلمة دالة (أو طريقة) تحتوي على معلمة واحدة فقط والمعلمة هي كائن حرفي ، فإننا نسمي هذا النمط نمط كائن التكوين. على سبيل المثال ، الكود التالي:
نسخة الكود كما يلي:
var conf = {
اسم المستخدم: "شيتشوان" ،
أولا: "تشوان" ،
آخر: "شي"
} ؛
addperson (conf) ؛
في AddPerson ، يمكنك استخدام قيمة Conf at Will ، والتي يتم استخدامها عمومًا لعملية التهيئة. على سبيل المثال ، يتم تنفيذ AjaxSetup في jQuery بهذه الطريقة:
نسخة الكود كما يلي:
// قم بتعيين القيمة الأولية مقدمًا
$ .ajaxsetup ({
عنوان URL: "/xmlhttp/" ،
عالمي: خطأ ،
النوع: "بعد"
}) ؛
// ثم اتصل مرة أخرى
$ .ajax ({data: myData}) ؛
بالإضافة إلى ذلك ، فإن العديد من المكونات الإضافية jQuery لديها أيضًا هذا الشكل من نقل المعلمة ، ولكن لا يمكن أيضًا نقلها. عندما لا تمر ، سيتم استخدام القيمة الافتراضية.
وظيفة العودة
يشير إرجاع وظيفة ما إلى وظيفة جديدة يتم إنشاؤها بمرونة بناءً على شروط محددة عندما تكون قيمة الإرجاع لوظيفة واحدة وظيفة أخرى ، أو يتم إنشاء وظيفة جديدة بمرونة وفقًا لشروط محددة. رمز المثال هو كما يلي:
نسخة الكود كما يلي:
var setup = function () {
console.log (1) ؛
وظيفة الإرجاع () {
console.log (2) ؛
} ؛
} ؛
// استدعاء وظيفة الإعداد
var my = setup () ؛ // الإخراج 1
لي()؛ // الإخراج 2
// أو يمكنك أيضًا الاتصال به مباشرة
يثبت()()()؛
أو يمكنك استخدام ميزة الإغلاق لتسجيل رقم عداد خاص في وظيفة الإعداد ، وزيادة العداد بكل مكالمة. الرمز كما يلي:
نسخة الكود كما يلي:
var setup = function () {
var count = 0 ؛
وظيفة الإرجاع () {
إرجاع ++ عدد
} ؛
} ؛
// الاستخدام
var next = setup () ؛
التالي()؛ // العودة 1
التالي()؛ // العودة 2
التالي()؛ // العودة 3
ملائم
التطبيق الجزئي هنا هو في الواقع فصل المعلمات الواردة. في بعض الأحيان ، قد يكون لسلسلة من العمليات واحدة أو عدة معلمات دائمًا كما هي. ثم يمكننا تحديد وظيفة جزئية أولاً ثم تنفيذ هذه الوظيفة (يتم تمرير المعلمات المختلفة المتبقية أثناء التنفيذ).
على سبيل المثال ، الرمز كما يلي:
نسخة الكود كما يلي:
var partialany = (function (APS) {
// هذه الوظيفة هي نتيجة تنفيذ تعبير الوظيفة الخاص بك ويتم تعيينها إلى المتغير الجزئي
وظيفة func (fn) {
var argsorig = aps.call (الوسائط ، 1) ؛
وظيفة الإرجاع () {
var args = [] ،
Argspartial = APS.Call (الحجج) ،
أنا = 0 ؛
// جميع مجموعات المعلمات الأصلية من المتغيرات ،
// إذا كانت المعلمة جزءًا جزئيًا ._ ، استخدم القيمة المقابلة لمعلمة الوظيفة التالية
// خلاف ذلك ، استخدم القيمة في المعلمة الأصلية
لـ (؛ i <argsorig.length ؛ i ++) {
args [i] = argsorig [i] === func._
؟ argspartial.shift ()
: argsorig [i] ؛
}
// إذا كان هناك أي معلمات إضافية ، أضف إلى النهاية
إرجاع fn.apply (هذا ، args.concat (Argspartial)) ؛
} ؛
}
// لإعدادات العنصر النائب
func._ = {} ؛
إرجاع func
}) (array.prototype.slice) ؛
كيفية استخدامه على النحو التالي:
نسخة الكود كما يلي:
// تحديد وظائف المعالجة
وظيفة Hex (R ، G ، B) {
إرجاع '#' + r + g + b ؛
}
// تحديد الوظيفة الجزئية ، خذ المعلمة الأولى R من Hex كقيمة المعلمة غير المتغيرة ff
var redmax = partialany (hex ، 'ff' ، partialany._ ، partialany._) ؛
// طريقة استدعاء الوظيفة الجديدة RedMax هي كما يلي ، وهناك حاجة إلى معلمات فقط:
console.log (Redmax ('11 '،' 22 ')) ؛ // "#ff1122"
إذا كنت تعتقد أن partialany._ طويل جدًا ، يمكنك استخدام __ بدلاً من ذلك.
نسخة الكود كما يلي:
var __ = partialany._ ؛
var greenmax = partialany (hex ، __ ، 'ff') ؛
console.log (greenmax ('33 '،' 44 ')) ؛
var bluemax = partialany (hex ، __ ، __ ، 'ff') ؛
console.log (Bluemax ('55 '،' 66 ')) ؛
var magentamax = partialany (hex ، 'ff' ، __ ، 'ff') ؛
console.log (Magentamax ('77 ')) ؛
بهذه الطريقة ، سيكون الأمر أكثر بساطة.
الكاري
يعد Currying ميزة للبرمجة الوظيفية ، وتحويل معالجة المعلمات المتعددة إلى معالجة المعلمات الفردية ، على غرار مكالمات السلسلة.
لنقدم مثالًا بسيطًا على وظيفة إضافة:
نسخة الكود كما يلي:
وظيفة إضافة (x ، y) {
var oldx = x ، oldy = y ؛
if (typeof oldy === "undefined") {// partial
وظيفة الإرجاع (Newy) {
إرجاع Oldx + Newy ؛
}
}
إرجاع x + y ؛
}
بهذه الطريقة هناك العديد من الطرق للاتصال ، مثل:
نسخة الكود كما يلي:
// امتحان
typeof add (5) ؛ // "وظيفة"
إضافة (3) (4) ؛ // 7
// هذا ممكن أيضًا
var add2000 = add (2000) ؛
add2000 (10) ؛ // 2010
بعد ذلك ، دعونا نحدد وظيفة الكاري الأكثر عمومية:
نسخة الكود كما يلي:
// المعلمة الأولى هي الوظيفة المراد تطبيقها ، والمعلمة الثانية هي الحد الأدنى لعدد المعلمات التي سيتم تمريرها في
وظيفة الكاري (func ، minargs) {
if (minargs == undefined) {
minargs = 1 ؛
}
وظيفة funcwithargsfrozen (Frozenargs) {
وظيفة الإرجاع () {
// معالجة التحسين ، إذا لم تكن هناك معلمات عند الاتصال ، أعد الوظيفة نفسها
var args = array.prototype.slice.call (وسيطات) ؛
var newargs = frozenargs.concat (args) ؛
if (newargs.length> = minargs) {
return func.apply (هذا ، Newargs) ؛
} آخر {
إرجاع funcwithargsfrozen (Newargs) ؛
}
} ؛
}
إرجاع funcwithargsfrozen ([]) ؛
}
وبهذه الطريقة ، يمكننا تحديد سلوك أعمالنا حسب الرغبة ، مثل تحديد الإضافة:
نسخة الكود كما يلي:
var plus = curry (function () {
VAR نتيجة = 0 ؛
لـ (var i = 0 ؛ i <endress.length ؛ ++ i) {
النتيجة += الوسائط [i] ؛
}
نتيجة العودة
} ، 2) ؛
كيفية استخدامه حقيقي ومتنوع.
نسخة الكود كما يلي:
زائد (3 ، 2) // مكالمة عادية
Plus (3) // تطبيق ، إرجاع وظيفة (قيمة الإرجاع هي 3+ قيمة المعلمة)
Plus (3) (2) // تطبيق كامل (العودة إلى 5)
Plus () (3) () () (2) // Return 5
Plus (3 ، 2 ، 4 ، 5) // يمكن أن تتلقى معلمات متعددة
زائد (3) (2 ، 3 ، 5) // بالمثل
فيما يلي مثال على الطرح
نسخة الكود كما يلي:
var minus = curry (function (x) {
var result = x ؛
لـ (var i = 1 ؛ i <enduments.length ؛ ++ i) {
النتيجة -= الحجج [i] ؛
}
نتيجة العودة
} ، 2) ؛
أو إذا كنت ترغب في تبديل ترتيب المعلمات ، فيمكنك تعريفه على هذا النحو
نسخة الكود كما يلي:
var flip = curry (function (func) {
إرجاع الكاري (وظيفة (أ ، ب) {
إرجاع func (b ، a) ؛
} ، 2) ؛
}) ؛
لخص
تحتوي الوظائف في JavaScript على العديد من الوظائف الخاصة ، ويمكنها استخدام خصائص المعلمة الإغلاق والوسائط لتنفيذ العديد من التقنيات المختلفة. في المقالة التالية ، سنستمر في تقديم تقنيات استخدام الدالة للتهيئة.