واصلت اليوم دراسة تنفيذ وظيفة الربط وتعلمت أيضًا بيانات Shim و Polyfill. دعنا نلخصها الآن.
if (! function.prototype.bind) {function.prototype.bind = function (othis) {if (typeof this! == "function") {// الأقرب الممكنة إلى ecmascript 5 وظيفة isCallable iscallable رمي نوع جديد ("function.prototype.bind - ما الذي يحاول أن يكون ملزمًا") ؛ } var aargs = array.prototype.slice.call (وسيطات ، 1) ، ftobind = this ، fnop = function () {} ، fbound = function () {return ftobind.apply (exturedope) } ؛ fnop.prototype = this.prototype ؛ fbound.prototype = new fnop () ؛ إرجاع fbound. } ؛}هذا تطبيق في الوثيقة الرسمية. سأتحدث عما أريد أن أقوله في جانبين.
الأول هو المعلمة ، واستخدام الزراعة
var aargs = array.prototype.slice.call (الوسيطات ، 1) ، هنا هو إخراج صفيف المعلمة من وظيفة ربط. المعلمة الأولى لا (أي ، لا othis) ، وهو الكائن الذي يجب ربطه بالطريقة ، والثاني هو
Aargs.concat (Array.Prototype.slice.call (الحجج))) ؛ هنا نستخدم طريقة الصفيف ، أدخل المعلمات وراء صفيف المعلمة. لاحظ أن هذه الوظيفة يتم إرجاعها وتنفيذها. صفيف المعلمة الخاص بها هي صفيف المعلمة لدالة fbound التي يتم إرجاعها ، وبالتالي فإن صفائف المعلمة العلوية والسفلية مختلفة ، مثل الكاري قليلاً.
والثاني هو السياق ، حيث يصعب فهم تغييرات السياق. يتم استخدام وظيفة الربط بشكل أساسي لربط السياق.
ftoBind = هذا هو سياق الكائن ، متبوعًا بالطريقة تطبيق أدناه للسماح للكائن بالالتزام باستخدام السياق
fnop.prototype = this.prototype ؛
fbound.prototype = new fnop () ؛
هنا ، يتم استخدام FNOP كوسيط لـ FBOUND ، مما يضمن تنفيذ FBOUND في السياق عند تعريفه. أصلا
bound.prototype = self.prototype يمكن أن يدمج السمات الأصلية ، ولكن وبهذه الطريقة ، تشير كلا سمات الكائن إلى نفس المكان ، وسيؤدي تعديل النمط المعني. لذلك ، يمكن للانتقال من خلال وظيفة فارغة يمكن أن يمنع هذا الموقف بشكل فعال من الحدوث.
المقالة أعلاه حول التنفيذ البسيط لوظيفة الربط في JS الأصلي هي كل المحتوى الذي شاركته معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.