في JavaScript ، يتم تغيير هذا الإشارة ديناميكيًا ، ومن المحتمل جدًا أن يتم تدمير هذا الإشارة بطريق الخطأ أثناء عملية كتابة البرنامج. لذلك ، نحتاج إلى تقنية يمكنها إصلاح معنى هذا ، لذلك لدينا ثلاث طرق: الاتصال والتطبيق وتربط بتغيير الإشارة إلى هذا داخل هيئة الوظيفة ، لأن الوظيفة لها مفاهيم "سياق التعريف" و "سياق وقت التشغيل" و "السياق يمكن تغييره"
تقدم ، اتصل
تطبيق: تطبيق طريقة واحدة لكائن معين واستبدل الكائن الحالي بكائن آخر
اتصل: اتصل على طريقة كائن لاستبدال الكائن الحالي بكائن آخر
وظيفة person () {} person.prototype = {attr: {العمر: 18 ، الجنس: 'girl'} ، say: function () {console.log ("بلدي is is" + this.attr.age) ؛ console.log ("أنا A" + this.attr.sex) ؛ }} var requary = new person () ؛ relect.say () ؛ // عمري 18 // أنا فتاةتغيير الاتجاه
وظيفة person () {} person.prototype = {attr: {العمر: 18 ، الجنس: 'girl'} ، say: function () {console.log ("بلدي is is" + this.attr.age) ؛ console.log ("أنا A" + this.attr.sex) ؛ }} xiaoming = {attr: {Age: 20 ، sex: 'boy'}} ؛ var realive = new person () ؛ relect.say () ؛ الزواج.ما هو شائع
يمكن استخدام كلاهما لاستدعاء طريقة بدلاً من كائن آخر ، وتغيير سياق الكائن لوظيفة من السياق الأولي إلى الكائن الجديد المحدد بواسطة thisoBJ.
الفرق
1. تطبيق: لا يمكن أن يكون هناك سوى معلمتين على الأكثر - هذا الكائن الجديد ومجموعة Argarray. إذا قمت بتمرير معلمات متعددة إلى هذه الطريقة ، فاكتب جميع المعلمات في هذه الصفيف. بالطبع ، حتى لو كانت هناك معلمة واحدة فقط ، فيجب كتابتها في الصفيف. إذا لم يكن Argarray صفيفًا صالحًا أو لم يكن كائن وسيطات ، فسيتم إنشاء Typeerror. إذا لم يتم تقديم وسيطات ، فسيتم استخدام الكائن العالمي كـ thisoBJ ولا يمكن تمرير أي وسيطات.
fun.call (thisarg [، arg1 [، arg2 [، ...]]]) وظيفة f (x ، y) {console.log (x+y) ؛} f.call (null ، 1 ، 1) // return 22. اتصل: إنها قائمة معلمات مباشرة ، والتي يتم استخدامها بشكل أساسي عندما يتم استدعاء طرق مختلفة من كائن JS لبعضها البعض ، بحيث يظل المؤشر الحالي متسقًا ، أو في الحالات الخاصة ، يجب تغيير هذا المؤشر. إذا لم يتم توفير معلمة thisoBJ ، فسيتم استخدام الكائن العالمي كـ thisoBJ.
fun.apply (thisarg ، [argsarray]) function f (x ، y) {console.log (x+y) ؛} f.call (null ، [1،1]) // return 2التطبيق هو نفسه وظيفة المكالمة ، باستثناء أن قائمة المعلمات الواردة مختلفة في النموذج. Thisarg هو السياق الذي تريد تحديده. يمكن أن يكون أي كائن JavaScript (كل شيء في JavaScript هو كائن). تحتاج المكالمة إلى تمرير المعلمات بالترتيب ، بينما يضع تطبيق المعلمات في صفيف.
إذا لم يتم إصلاح عدد معلمات الوظيفة ، فاستخدم استدعاء عندما تعرف المعلمات بوضوح الكمية ، واستخدمها تنطبق عندما تكون غير مؤكدة ، ثم دفع المعلمة إلى الصفيف ومررها. عندما يكون عدد المعلمات غير مؤكد ، يمكن للدالة أيضًا اجتياز جميع المعلمات من خلال صفيف الوسائط. دعونا نلقي نظرة على بعض الاستخدامات
الرمز 1
var array1 = [12 ، "foo" ، {name: "Joe"} ، -2458] ؛ var array2 = ["doe" ، 555 ، 100] ؛ array.prototype.push.apply (array1 ، array2) ؛ console.log (array1) ؛ // [12 ،الرمز الثاني
VAR NUMBERS = [5 ، 458 ، 120 ، -215] ؛ Math.Max.Apply (NULL ، NULL) ؛ // 458
الرمز الثالث
LOG (12 ، "foo" ، {name: "Joe"} ، -2458) ؛ function log () {var args = array.prototype.slice.call (mations) ؛ args.unshift ('(app)') ؛ console.log.apply (وحدة التحكم ، args) ؛} ؛ // (APP) 12 foo Object {name: "Joe"} -2458ربط
fun.bind (thisarg [، arg1 [، arg2 [، ...]]]]))
على عكس ما سبق ، ستعيد BIND وظيفة جديدة تغير هذا الإشارة. لاحظ أنه يتم التأكيد على الوظيفة الجديدة هنا ، والتي ليست هي نفس عنوان الذاكرة كما هو الحال من قبل ، لذلك عندما تحتاج إلى إعادة استخدام هذه الوظيفة ، يجب عليك حفظها إلى متغير لتسهيل المكالمة التالية. وظيفتان أعلاه هما نتائج التنفيذ التي تم إرجاعها ، أي ، يتم تنفيذ المكالمة.
الصف ، بالإضافة إلى ذلك ، هناك شيء آخر يجب ملاحظته هو أن المعلمة الأولى في وظيفة BIND ستصبح تلقائيًا القيمة الافتراضية لإرجاع المعلمات في الوظيفة الجديدة. ثم عندما يتم استدعاء المكالمة الرسمية ، تحتاج فقط إلى إعطاء المعلمات المتبقية باستثناء المعلمة الأولى.
الدالة f (x ، y) {console.log (x+y) ؛} f.call (null ، [1،1]) var new_f = f.bind (null ، 1،1) // return new functionnew_f (1) // return 2تجدر الإشارة إلى أن معلمة thisarg في جميع رموز المثال أعلاه يتم استبدالها بـ NULL. عندما لا يتم تحديد كائن Thisarg ، فإن هذا الإشارة هو كائن عالمي تحت Null وغير محدد ، أي بيئة تنفيذ رمز JS
تطبيق ، مكالمة ، مقارنة بين
var obj = {bar: 'oops ، هذه فكرة سيئة'} ؛ var foo = {get: function () {return this.bar ؛ }} var bind = foo.get.bind (obj) ، call = foo.get.call (obj) ، تطبيق = foo.get.apply (obj) ؛ console.log (bind () ، call ، تطبيق) ؛ console.log (ربط ، مكالمة ، تطبيق) ؛ console.log (typeof bind ، typeof call ، typeof تطبيق) ؛ console.log (typeof bind () ، typeof call ، typeof تطبيق) ؛لا أرى أي فرق. الفرق هو أنه عندما تريد تغيير السياق ، لا يتم تنفيذه على الفور ، ولكن يتم تنفيذ رد الاتصال ، استخدم طريقة Bind (). تطبيق/المكالمة سيتم تنفيذ الوظيفة على الفور
تطبيق ، مكالمة ، يتم استخدام جميعها لتغيير الإشارة إلى هذا الكائن من الوظيفة ؛ المعلمات الأولى للتطبيق ، والمكالمة ، والربط كلها كائنات يجب أن توير إليها ، أي السياق المراد تحديده ؛ تطبيق ، مكالمة ، BIND يمكن أن تستخدم جميع المعلمات اللاحقة لتمرير المعلمات ؛ يرجع ربط الوظيفة المقابلة ، والتي تكون مريحة للاتصال لاحقًا ؛ التقديم ، يتم استدعاء المكالمة على الفور
إن المقالة أعلاه تتفهم بعمق الفرق بين الأساليب والتطبيق والربط في JavaScript هي كل المحتوى الذي أشاركه معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.