Baseline Widely available
СводкаÐеÑод bind()
ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿Ñи вÑзове ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð² каÑеÑÑве конÑекÑÑа вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ this
пÑедоÑÑавленное знаÑение. РмеÑод Ñакже пеÑедаÑÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð°ÑгÑменÑов, коÑоÑÑе бÑдÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¿ÐµÑед пеÑеданнÑми в пÑивÑзаннÑÑ ÑÑнкÑÐ¸Ñ Ð°ÑгÑменÑами пÑи ÐµÑ Ð²Ñзове.
fun.bind(thisArg[, arg1[, arg2[, ...]]])ÐаÑамеÑÑÑ
thisArg
ÐнаÑение, пеÑедаваемое в каÑеÑÑве this
в ÑелевÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ñи вÑзове пÑивÑзанной ÑÑнкÑии. ÐнаÑение игноÑиÑÑеÑÑÑ, еÑли пÑивÑÐ·Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ ÐºÐ¾Ð½ÑÑÑÑиÑÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа new
.
arg1, arg2, ...
ÐÑгÑменÑÑ Ñелевой ÑÑнкÑии, пеÑедаваемÑе пеÑед аÑгÑменÑами пÑивÑзанной ÑÑнкÑии пÑи вÑзове Ñелевой ÑÑнкÑии.
ÐеÑод bind()
ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ "пÑивÑзаннÑÑ ÑÑнкÑиÑ" (ÐФ). ÐФ - ÑÑо "необÑÑнÑй ÑÑнкÑионалÑнÑй обÑекÑ" ( ÑеÑмин из ECMAScript 6 ), коÑоÑÑй ÑвлÑеÑÑÑ Ð¾Ð±ÑÑÑкой над иÑÑ
однÑм ÑÑнкÑионалÑнÑм обÑекÑом. ÐÑзов ÐФ пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° обÑÑнÑÑой ÑÑнкÑии.
ÐФ Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑие внÑÑÑенние ( ÑкÑÑÑÑе ) ÑвойÑÑва:
Ðогда ÐФ вÑзÑваеÑÑÑ, иÑполнÑеÑÑÑ ÐµÑ Ð²Ð½ÑÑÑенний меÑод [[Call]] Ñо ÑледÑÑÑими аÑгÑменÑами Call(target, boundThis, args).
ÐÑивÑÐ·Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑконÑÑÑÑиÑована Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа new
: ÑÑо ÑабоÑÐ°ÐµÑ Ñак, как еÑли Ð±Ñ Ð²Ð¼ÐµÑÑо Ð½ÐµÑ ÐºÐ¾Ð½ÑÑÑÑиÑовалаÑÑ ÑÐµÐ»ÐµÐ²Ð°Ñ ÑÑнкÑиÑ. ÐÑедоÑÑавлÑемое знаÑение this
в ÑÑом ÑлÑÑае игноÑиÑÑеÑÑÑ, Ñ
оÑÑ Ð²ÐµÐ´ÑÑие аÑгÑменÑÑ Ð²ÑÑ ÐµÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð² ÑмÑлиÑÑемÑÑ ÑÑнкÑиÑ.
ÐÑоÑÑейÑим ÑпоÑобом иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ bind()
ÑвлÑеÑÑÑ Ñоздание ÑÑнкÑии, коÑоÑаÑ, вне завиÑимоÑÑи Ð¾Ñ ÑпоÑоба ÐµÑ Ð²Ñзова, вÑзÑваеÑÑÑ Ñ Ð¾Ð¿ÑеделÑннÑм знаÑением this
. ÐбÑÑнÑм заблÑждением Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñков в JavaScript ÑвлÑеÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑение меÑода из обÑекÑа Ñ ÑелÑÑ ÐµÐ³Ð¾ далÑнейÑего вÑзова в каÑеÑÑве ÑÑнкÑии и ожидание Ñого, ÑÑо он бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾ÑигиналÑнÑй обÑÐµÐºÑ Ð² каÑеÑÑве Ñвоего знаÑÐµÐ½Ð¸Ñ this
(напÑимеÑ, Ñакое Ð¼Ð¾Ð¶ÐµÑ ÑлÑÑиÑÑÑÑ Ð¿Ñи иÑполÑзовании меÑода как колбÑк-ÑÑнкÑии). Ðднако, без ÑпеÑиалÑной обÑабоÑки, оÑигиналÑнÑй обÑÐµÐºÑ Ð·Ð°ÑаÑÑÑÑ ÑеÑÑеÑÑÑ. Создание пÑивÑзанной ÑÑнкÑии из ÑÑнкÑии, иÑполÑзÑÑÑей оÑигиналÑнÑй обÑекÑ, изÑÑно ÑеÑÐ°ÐµÑ ÑÑÑ Ð¿ÑоблемÑ:
this.x = 9;
var module = {
x: 81,
getX: function () {
return this.x;
},
};
module.getX(); // 81
var getX = module.getX;
getX(); // 9, поÑколÑÐºÑ Ð² ÑÑом ÑлÑÑае this ÑÑÑлаеÑÑÑ Ð½Ð° глобалÑнÑй обÑекÑ
// ÑоздаÑм новÑÑ ÑÑнкÑÐ¸Ñ Ñ this, пÑивÑзаннÑм к module
var boundGetX = getX.bind(module);
boundGetX(); // 81
ÐÑимеÑ: ÑаÑÑиÑнÑе ÑÑнкÑии
СледÑÑÑим пÑоÑÑейÑим ÑпоÑобом иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ bind()
ÑвлÑеÑÑÑ Ñоздание ÑÑнкÑии Ñ Ð¿ÑедопÑеделÑннÑми аÑгÑменÑами. ÐÑи аÑгÑменÑÑ (еÑли они еÑÑÑ) пеÑедаÑÑÑÑ Ð¿Ð¾Ñле знаÑÐµÐ½Ð¸Ñ this
и вÑÑавлÑÑÑÑÑ Ð¿ÐµÑед аÑгÑменÑами, пеÑедаваемÑми в ÑелевÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ñи вÑзове пÑивÑзанной ÑÑнкÑии.
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
// СоздаÑм ÑÑнкÑÐ¸Ñ Ñ Ð¿ÑедÑÑÑановленнÑм ведÑÑим аÑгÑменÑом
var leadingThirtysevenList = list.bind(undefined, 37);
var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
ÐÑимеÑ: Ñ setTimeout
Ðо ÑмолÑаниÑ, внÑÑÑи window.setTimeout()
конÑекÑÑ this
ÑÑÑанавливаеÑÑÑ Ð² обÑÐµÐºÑ window
(или global
). ÐÑи ÑабоÑе Ñ Ð¼ÐµÑодами клаÑÑа, ÑÑебÑÑÑими this
Ð´Ð»Ñ ÑÑÑлки на ÑкземплÑÑÑ ÐºÐ»Ð°ÑÑа, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе Ñвно пÑивÑзаÑÑ this
к колбÑк-ÑÑнкÑии Ð´Ð»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑкземплÑÑа.
function LateBloomer() {
this.petalCount = Math.ceil(Math.random() * 12) + 1;
}
// ÐбÑÑвлÑем ÑвеÑение Ñ Ð·Ð°Ð´ÐµÑжкой в 1 ÑекÑндÑ
LateBloomer.prototype.bloom = function () {
window.setTimeout(this.declare.bind(this), 1000);
};
LateBloomer.prototype.declare = function () {
console.log("Я пÑекÑаÑнÑй ÑвеÑок Ñ " + this.petalCount + " лепеÑÑками!");
};
ÐÑимеÑ: пÑивÑзÑвание ÑÑнкÑий, иÑполÑзÑемÑÑ
в каÑеÑÑве конÑÑÑÑкÑоÑов
ÐÑедÑпÑеждение: ÐÑÐ¾Ñ Ñаздел демонÑÑÑиÑÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи JavaScript и докÑменÑиÑÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе гÑаниÑнÑе ÑлÑÑаи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑода bind()
. ÐоказаннÑе ниже меÑÐ¾Ð´Ñ Ð½Ðµ ÑвлÑÑÑÑÑ Ð»ÑÑÑей пÑакÑикой и, веÑоÑÑно, иÑ
не ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² ÑабоÑем окÑÑжении.
ÐÑивÑзаннÑе ÑÑнкÑии авÑомаÑиÑеÑки подÑ
одÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑÑе Ñ Ð¾Ð¿ÐµÑаÑоÑом new
Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
ÑкземплÑÑов, ÑоздаваемÑÑ
Ñелевой ÑÑнкÑией. Ðогда пÑивÑÐ·Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑениÑ, пÑедоÑÑавлÑемое знаÑение this
игноÑиÑÑеÑÑÑ. Ðднако, пÑедоÑÑавлÑемÑе аÑгÑменÑÑ Ð²ÑÑ Ñак же вÑÑавлÑÑÑÑÑ Ð¿ÐµÑед аÑгÑменÑами конÑÑÑÑкÑоÑа:
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return this.x + "," + this.y;
};
var p = new Point(1, 2);
p.toString(); // '1,2'
var emptyObj = {};
var YAxisPoint = Point.bind(emptyObj, 0 /*x*/);
// не поддеÑживаеÑÑÑ Ð¿Ð¾Ð»Ð¸Ñилом, пÑиведÑннÑм ниже,
// но оÑлиÑно ÑабоÑÐ°ÐµÑ Ñ ÑоднÑм bind:
var YAxisPoint = Point.bind(null, 0 /*x*/);
var axisPoint = new YAxisPoint(5);
axisPoint.toString(); // '0,5'
axisPoint instanceof Point; // true
axisPoint instanceof YAxisPoint; // true
new Point(17, 42) instanceof YAxisPoint; // true
ÐбÑаÑиÑе внимание, ÑÑо вам не нÑжно делаÑÑ Ð½Ð¸Ñего оÑобенного Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑивÑзанной ÑÑнкÑии, иÑполÑзÑемой Ñ Ð¾Ð¿ÐµÑаÑоÑом new
. РиÑоге, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñвно вÑзÑваемой пÑивÑзанной ÑÑнкÑии, вам Ñоже не нÑжно делаÑÑ Ð½Ð¸Ñего оÑобенного, даже еÑли вам ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑивÑÐ·Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑзÑвалаÑÑ ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа new
.
// ÐÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑÑен пÑÑмо в ваÑей конÑоли JavaScript
// ...пÑодолжение пÑимеÑа вÑÑе
// ÐÑÑ ÐµÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ ÐºÐ°Ðº ноÑмалÑнÑÑ ÑÑнкÑиÑ
// (Ñ
оÑÑ Ð¾Ð±ÑÑно ÑÑо не пÑедполагаеÑÑÑ)
YAxisPoint(13);
emptyObj.x + "," + emptyObj.y;
// > '0,13'
ÐÑли Ð²Ñ Ñ
оÑиÑе поддеÑживаÑÑ Ð¸ÑполÑзование пÑивÑзанной ÑÑнкÑии ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа new
, либо ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑÑмого вÑзова, ÑÐµÐ»ÐµÐ²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑедÑÑмаÑÑиваÑÑ Ñакие огÑаниÑениÑ.
ÐеÑод bind()
Ñакже полезен в ÑлÑÑаÑÑ
, еÑли Ð²Ñ Ñ
оÑиÑе ÑоздаÑÑ ÑокÑаÑение Ð´Ð»Ñ ÑÑнкÑии, ÑÑебÑÑÑей опÑеделÑнное знаÑение this
.
ÐозÑмÑм, напÑимеÑ, меÑод Array.prototype.slice
, коÑоÑÑй Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑÑивоподобного обÑекÑа в наÑÑоÑÑий маÑÑив. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾Ðµ ÑокÑаÑение:
var slice = Array.prototype.slice;
// ...
slice.call(arguments);
С помоÑÑÑ Ð¼ÐµÑода bind()
, ÑÑо ÑокÑаÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑпÑоÑено. Ð ÑледÑÑÑем кÑÑке кода slice
ÑвлÑеÑÑÑ ÑÑнкÑией, пÑивÑзанной к ÑÑнкÑии call()
обÑекÑа Function.prototype
, Ñо знаÑением this
, ÑÑÑановленнÑм в ÑÑнкÑÐ¸Ñ slice()
обÑекÑа Array.prototype
. ÐÑо ознаÑаеÑ, ÑÑо дополниÑелÑнÑй вÑзов call()
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑÑанÑн:
// Тоже Ñамое, ÑÑо и slice в пÑедÑдÑÑем пÑимеÑе
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
// ...
slice(arguments);
ÐолиÑил
ФÑнкÑÐ¸Ñ bind
ÑвлÑеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸ÐµÐ¼ к ÑÑандаÑÑÑ ECMA-262 5-го изданиÑ; поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð° Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð½Ðµ во вÑеÑ
бÑаÑзеÑаÑ
. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑаÑÑиÑно обойÑи ÑÑо огÑаниÑение, вÑÑавив ÑледÑÑÑий код в наÑало ваÑиÑ
ÑкÑипÑов, он позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð±Ð¾Ð»ÑÑÑÑ ÑаÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей bind()
в ÑеализаÑиÑÑ
, не имеÑÑиÑ
его Ñодной поддеÑжки.
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// ближайÑий аналог внÑÑÑенней ÑÑнкÑии
// IsCallable в ECMAScript 5
throw new TypeError(
"Function.prototype.bind - what is trying to be bound is not callable",
);
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(
this instanceof fNOP && oThis ? this : oThis,
aArgs.concat(Array.prototype.slice.call(arguments)),
);
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
ÐекоÑоÑÑе из Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð¾ÑлиÑий (Ñак же могÑÑ Ð±ÑÑÑ Ð¸ дÑÑгие, даннÑй ÑпиÑок далеко не иÑÑеÑпÑваÑÑий) Ð¼ÐµÐ¶Ð´Ñ ÑÑой ÑеализаÑией и ÑеализаÑией по ÑмолÑаниÑ:
Array.prototype.slice()
, Array.prototype.concat()
, Function.prototype.call()
и Function.prototype.apply()
ÑвлÑÑÑÑÑ Ð²ÑÑÑоеннÑми, имеÑÑ ÑÐ²Ð¾Ñ Ð¿ÐµÑвонаÑалÑное знаÑение.caller
и arguments
â коÑоÑÑе вÑбÑаÑÑваÑÑ Ð¸ÑклÑÑение TypeError
пÑи попÑÑке полÑÑиÑÑ, ÑÑÑановиÑÑ Ð¸Ð»Ð¸ ÑдалиÑÑ ÑÑи ÑвойÑÑва. (Такие ÑвойÑÑва могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ, еÑли ÑеализаÑÐ¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Object.defineProperty
, либо ÑаÑÑиÑно ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ [без Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸ÑклÑÑение-пÑи-попÑÑке-ÑдалениÑ], еÑли ÑеализаÑÐ¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Object.prototype.__defineGetter__()
и Object.prototype.__defineSetter__()
.)prototype
. (ÐÑавилÑÐ½Ð°Ñ Ð¿ÑивÑÐ·Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ ÐµÐ³Ð¾ не имееÑ.)length
не ÑооÑвеÑÑÑвÑÐµÑ Ñ Ð¾Ð¿Ñеделением в ECMA-262; оно Ñавно 0, в Ñо вÑемÑ, как Ð¿Ð¾Ð»Ð½Ð°Ñ ÑеализаÑиÑ, в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑвойÑÑва length
Ñелевой ÑÑнкÑии и колиÑеÑÑва пÑедопÑеделÑннÑÑ
аÑгÑменÑов, Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ Ð·Ð½Ð°Ñение, оÑлиÑное Ð¾Ñ Ð½ÑлÑ.ÐÑли Ð²Ñ ÑеÑили иÑполÑзоваÑÑ ÑаÑÑиÑнÑÑ ÑеализаÑиÑ, не ÑаÑÑÑиÑÑвайÑе на коÑÑекÑнÑÑ ÑабоÑÑ Ð² ÑеÑ
ÑлÑÑаÑÑ
, когда ÑеализаÑÐ¸Ñ Ð¾ÑклонÑеÑÑÑ Ð¾Ñ ÑпеÑиÑикаÑии ECMA-262 5-го изданиÑ! Ðднако, в опÑеделÑннÑÑ
ÑлÑÑаÑÑ
(и, возможно, Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми модиÑикаÑиÑми Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
нÑжд), пÑименение данной ÑаÑÑиÑной ÑеализаÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ опÑавданнÑм до ÑеÑ
поÑ, пока bind()
не ÑÑÐ°Ð½ÐµÑ ÑиÑоко Ñеализован в ÑооÑвеÑÑÑвии Ñо ÑпеÑиÑикаÑией.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4