قبل بضعة أسابيع ، قمت بنشر منشور Weibo قائلًا إنني أحب الوظائف التي تعود وظائفها. سرعان ما ظهرت بعض الردود ، كلها أساسا ... ماذا؟ ! بالنسبة للمبرمج ، يعد فهم الوظيفة التي تُرجع الوظيفة مهارة مهمة للغاية. باستخدامه ، يمكنك حفظ الكثير من التعليمات البرمجية ، وجعل JavaScript أكثر كفاءة ، والسماح لك بمزيد من فهم قوة JavaScript. فيما يلي بعض الأمثلة البسيطة التي كتبتها ، والتي من خلالها يمكنك فهم ما أعنيه.
لنفترض أن لديك كائنًا يحتوي على كائنين للأطفال ، ولديهما جميعًا طريقة GET. هاتان الطريقتان متشابهتان للغاية ومختلفان قليلاً:
var accessors = {sortable: {get: function () {return typeof this.getAttribute ('sortable')! = 'undefined' ؛ }} ، قابلة للاستعداد: {get: function () {return typeof this.getAttribute ('droppable')! = 'undefined' ؛ }}} ؛الكود المتكرر ليس ظاهرة جيدة ، لذلك نحن بحاجة إلى إنشاء وظيفة خارجية وقبول اسم خاصية:
وظيفة getAttribute (attr) {return typeof this.getAttribute (attr)! = 'undefined' ؛} var accessors = {sortable: {get: function () {return getAttribute ('sortable') ؛ }} ، قابلة للاستعداد: {get: function () {return getAttribute ('droppable') ؛ }}} ؛هذا أفضل بكثير ، لكنه لا يزال غير مثالي لأنه لا يزال هناك بعض الأجزاء الزائدة. طريقة أفضل هي السماح لها بإعادة الوظيفة التي تحتاجها مباشرة في النهاية - سيؤدي ذلك إلى التخلص من تنفيذ الوظيفة الزائدة:
دالة generategetMethod (attr) {return function () {return typeof this.getAttribute (attr)! = 'undefined' ؛ } ؛} var accessors = {sortable: {get: generategetMethod ('sortable')} ، قابلة للاستعداد: {get: generategetMethod ('sproppable')}} ؛/ * إنه مكافئ تمامًا للطريقة الأصلية: */var accessors = {get: get: function () {return that. }} ، قابلة للاستعداد: {get: function () {return typeof this.getAttribute ('droppable')! = 'undefined' ؛ }}} ؛*/ما تراه أعلاه هو وظيفة تُرجع وظيفة ؛ كل كائن طفل له طريقة GET الخاصة به ، ولكن تتم إزالة عملية تنفيذ الوظيفة غير الضرورية.
هذه تقنية مفيدة للغاية يمكن أن تساعدك على التخلص من تكرار رمز مماثل. إذا تم استخدامه بشكل صحيح ، فقد يجعل الكود الخاص بك أكثر قابلية للقراءة وأسهل للحفاظ عليه!
هل تفهم؟