في الماضي ، ربما تكون قد حددت Self = هذا أو ذاك = هذا ، وما إلى ذلك ، والتي ستعمل بالطبع ، ولكن استخدام function.prototype.bind () سيكون أفضل وسيبدو أكثر احترافية.
هنا مثال بسيط:
نسخة الكود كما يلي:
var myobj = {
خاصية: Function () {
} ،
anotherspecialfunction: function () {
} ،
getasyncdata: وظيفة (CB) {
CB () ؛
} ،
Render: function () {
var that = هذا ؛
this.getasyncdata (function () {
that.specialFunction () ؛
that.anotherspecialfunction () ؛
}) ؛
}
} ؛
myobj.render () ؛
في هذا المثال ، للحفاظ على سياق myobj ، وهو متغير تم تعيينه = هذا ، والذي يعمل ، لكنه لا يبدو مرتبًا دون استخدام function.prototype.bind ():
نسخة الكود كما يلي:
Render: function () {
this.getasyncdata (function () {
this.specialFunction () ؛
this.anotherspecialfunction () ؛
} .bind (هذا)) ؛
}
عند الاتصال .bind () ، فإنه سيقوم ببساطة بإنشاء وظيفة جديدة وتمرير هذه الوظيفة إلى هذه الوظيفة. الرمز الذي ينفذ .bind () يشبه هذا:
انسخ الرمز كما يلي: function.prototype.bind = function (scope) {
var fn = هذا ؛
وظيفة الإرجاع () {
إرجاع fn.apply (النطاق) ؛
} ؛
}
فيما يلي مثال بسيط على استخدام function.prototype.bind ():
نسخة الكود كما يلي:
var foo = {
X: 3
} ؛
var bar = function () {
console.log (this.x) ؛
} ؛
بار () ؛
var boundfunc = bar.bind (foo) ؛
poundfunc () ؛
أليس من المفيد جدا؟ لسوء الحظ ، لا تدعم متصفحات IE أدناه IE8 وأسفل وظيفة. تشمل المتصفحات المدعومة Chrome 7+ ، Firefox 4.0+ ، IE 9+ ، Opera 11.60+ ، Safari 5.1.4+. على الرغم من أن IE 8/7/6 والمتصفحات الأخرى لا تدعمها ، إلا أن مجموعة تطوير Mozilla كتبت وظيفة مع وظائف مماثلة للإصدار القديم من متصفح IE ، مع الكود كما يلي:
نسخة الكود كما يلي:
if (! function.prototype.bind) {
function.prototype.bind = function (othis) {
if (typeof this! == "function") {
// أقرب شيء ممكن إلى وظيفة ECMASCRIPT 5 الداخلية
رمي typeerror جديد ("function.prototype.bind - ما يحاول أن يكون ملزمًا غير قابل للاتصال") ؛
}
var aargs = array.prototype.slice.call (وسيطات ، 1) ،
ftobind = هذا ،
fnop = function () {} ،
fbound = function () {
إرجاع ftobind.apply (هذا مثيل fnop && othis
؟ هذا
: othis ،
Aargs.concat (Array.Prototype.slice.call (الحجج))) ؛
} ؛
fnop.prototype = this.prototype ؛
fbound.prototype = new fnop () ؛
إرجاع fbound.
} ؛
}