В прошлом вы могли установить Self = that или ther = this и т. Д., Который, конечно, будет работать, но использование функции.prototype.bind () будет лучше, и это будет выглядеть более профессиональным.
Вот простой пример:
Кода -копия выглядит следующим образом:
var myobj = {
SpecialFunction: function () {
},
Anotherpecialfunction: function () {
},
getAsyncdata: function (cb) {
cb ();
},
render: function () {
var that = это;
this.getasyncdata (function () {
что. Specialfunction ();
что. Anotherpecialfunction ();
});
}
};
myobj.render ();
В этом примере для поддержания контекста MYOBJ, переменной, которая установлена, которая работает, но она не выглядит опрятно без использования функции.prototype.bind ():
Кода -копия выглядит следующим образом:
render: function () {
this.getasyncdata (function () {
this.specialfunction ();
this.AnotherPecialFunction ();
} .bind (this));
}
При вызове .bind () он просто создаст новую функцию и передаст ее этой функции. Код, который реализует .bind () примерно так:
Скопируйте код следующим образом: function.prototype.bind = function (scope) {
var fn = this;
return function () {
вернуть fn.Apply (сферу);
};
}
Вот простой пример использования function.prototype.bind ():
Кода -копия выглядит следующим образом:
var foo = {
x: 3
};
var bar = function () {
console.log (this.x);
};
Бар ();
var boundfunc = bar.bind (foo);
Boundfunc ();
Разве это не очень полезно? К сожалению, т.е. браузеры ниже IE8 и ниже не поддерживают функцию .prototype.bind (). Поддерживаемые браузеры включают Chrome 7+, Firefox 4.0+, IE 9+, Opera 11,60+, Safari 5.1.4+. Хотя IE 8/7/6 и другие браузеры не поддерживают его, группа разработчиков Mozilla написала функцию с аналогичными функциями для старой версии IE Browser, с кодом следующим образом:
Кода -копия выглядит следующим образом:
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 () {
return ftobind.apply (этот экземпляр fnop && othis
? этот
: Othis,
aargs.concat (array.prototype.slice.call (аргументы)));
};
fnop.prototype = this.prototype;
fbound.prototype = new fnop ();
вернуть fbound;
};
}