Function.prototype.apply()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
ÐбÑие ÑведениÑ
ÐеÑод apply() вÑзÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ Ñ ÑказаннÑм знаÑением this и аÑгÑменÑами, пÑедоÑÑавленнÑми в виде маÑÑива (либо маÑÑивоподобного обÑекÑа).
ÐÑимеÑание:
ХоÑÑ ÑинÑакÑÐ¸Ñ ÑÑой ÑÑнкÑии пÑакÑиÑеÑки полноÑÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑен ÑÑнкÑии call(), ÑÑндаменÑалÑное ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÑÑнкÑÐ¸Ñ call() пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑпиÑок аÑгÑменÑов, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑÑнкÑÐ¸Ñ apply() пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÐµÐ´Ð¸Ð½Ð¸ÑнÑй маÑÑив аÑгÑменÑов.
СинÑакÑиÑ
fun.apply(thisArg, [argsArray])
ÐаÑамеÑÑÑ
thisArg-
ÐнаÑение
this, пÑедоÑÑавлÑемое Ð´Ð»Ñ Ð²Ñзова ÑÑнкÑииfun. ÐбÑаÑиÑе внимание, ÑÑоthisÐ¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ ÑеалÑнÑм знаÑением, видимÑм ÑÑим меÑодом: еÑли меÑод ÑвлÑеÑÑÑ ÑÑнкÑией в неÑÑÑогом Ñежиме, знаÑениÑnullиundefinedбÑдÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑм обÑекÑом, а пÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ ÑÐ¿Ð°ÐºÐ¾Ð²Ð°Ð½Ñ Ð² обÑекÑÑ. argsArrayÐеобÑзаÑелÑнÑй-
ÐаÑÑивоподобнÑй обÑекÑ, опÑеделÑÑÑий аÑгÑменÑÑ, Ñ ÐºÐ¾ÑоÑÑми ÑÑнкÑиÑ
funдолжна бÑÑÑ Ð²Ñзвана, либоnullилиundefined, еÑли в ÑÑнкÑÐ¸Ñ Ð½Ðµ надо пеÑедаваÑÑ Ð°ÑгÑменÑÑ. ÐаÑÐ¸Ð½Ð°Ñ Ñ ECMAScript 5 ÑÑи аÑгÑменÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð±Ð¾Ð±ÑÑннÑми маÑÑивоподобнÑми обÑекÑами, а не ÑолÑко маÑÑивом. СмоÑÑиÑе ниже инÑоÑмаÑÐ¸Ñ Ð¿Ð¾ ÑовмеÑÑимоÑÑи Ñ Ð±ÑаÑзеÑами.
ÐпиÑание
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑиÑваиваÑÑ ÑазлиÑнÑе обÑекÑÑ this пÑи вÑзове ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии. this ÑÑÑлаеÑÑÑ Ð½Ð° ÑекÑÑий обÑекÑ, вÑзÑваÑÑий обÑекÑ. С помоÑÑÑ apply() Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе напиÑаÑÑ Ð¼ÐµÑод один Ñаз, а заÑем наÑледоваÑÑ ÐµÐ³Ð¾ в дÑÑгиÑ
обÑекÑаÑ
без необÑ
одимоÑÑи пеÑепиÑÑваÑÑ Ð¼ÐµÑод Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ нового обÑекÑа.
ÐеÑод apply оÑÐµÐ½Ñ Ð¿Ð¾Ñ
ож на меÑод call(), за иÑклÑÑением поддеÑживаемого Ñипа аÑгÑменÑов. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼Ð°ÑÑив аÑгÑменÑов вмеÑÑо набоÑа именованнÑÑ
паÑамеÑÑов. ÐмеÑÑе Ñ apply Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð»Ð¸ÑеÑал маÑÑива, напÑимеÑ, fun.apply(this, ['еÑÑÑ', 'бананÑ']), либо обÑÐµÐºÑ Array, напÑимеÑ, fun.apply(this, new Array('еÑÑÑ', 'бананÑ')).
Также Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð² каÑеÑÑве паÑамеÑÑа argsArray пÑевдомаÑÑив arguments. arguments ÑвлÑеÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñной пеÑеменной ÑÑнкÑии. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
неопÑеделÑннÑÑ
аÑгÑменÑов вÑзÑваемого обÑекÑа. Таким обÑазом, Ð²Ñ Ð½Ðµ обÑÐ·Ð°Ð½Ñ Ð·Ð½Ð°ÑÑ, ÑколÑко и какие аÑгÑменÑÑ ÑÑебÑÐµÑ Ð²ÑзÑваемÑй обÑÐµÐºÑ Ð¿Ñи иÑполÑзовании меÑода apply(). ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¿ÑевдомаÑÑив arguments Ð´Ð»Ñ Ð¿ÐµÑедаÑи вÑеÑ
аÑгÑменÑов в вÑзÑваемÑй обÑекÑ. ÐÑзÑваемÑй обÑÐµÐºÑ ÑамоÑÑоÑÑелÑно ÑазбеÑÑÑÑÑ Ñ Ð¾Ð±ÑабоÑкой аÑгÑменÑов.
ÐаÑÐ¸Ð½Ð°Ñ Ñ 5-го Ð¸Ð·Ð´Ð°Ð½Ð¸Ñ ECMAScript, Ð²Ñ Ñакже можеÑе иÑполÑзоваÑÑ Ð»Ñбой вид маÑÑивоподобного обÑекÑа, ÑÑо на пÑакÑике ознаÑаеÑ, ÑÑо он должен имеÑÑ ÑвойÑÑво length и ÑелоÑиÑленнÑе ÑвойÑÑва в диапазоне (0...length). РкаÑеÑÑве пÑимеÑа, ÑепеÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ NodeList или Ñвой ÑобÑÑвеннÑй обÑÐµÐºÑ Ð²Ð¸Ð´Ð° { 'length': 2, '0': 'еÑÑÑ', '1': 'бананÑ' }.
ÐÑимеÑание: ÐолÑÑинÑÑво бÑаÑзеÑов, вклÑÑÐ°Ñ Chrome 14 и Internet Explorer 9, вÑÑ ÐµÑÑ Ð½Ðµ пÑинимаÑÑ Ð¼Ð°ÑÑивоподобнÑе обÑекÑÑ Ð¸ бÑдÑÑ Ð²ÑбÑаÑÑваÑÑ Ð¸ÑклÑÑение.
ÐÑимеÑÑ
>ÐÑимеÑ: иÑполÑзование apply() Ð´Ð»Ñ ÑвÑзи конÑÑÑÑкÑоÑов обÑекÑа в ÑепоÑкÑ
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼ÐµÑод apply() Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² ÑепоÑÐºÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑов обÑекÑа, как в Java. Ð ÑледÑÑÑем пÑимеÑе Ð¼Ñ Ñоздадим в обÑекÑе Function глобалÑнÑй меÑод construct(), коÑоÑÑй Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð½Ð°Ð¼ иÑполÑзоваÑÑ Ð¼Ð°ÑÑивоподобнÑе обÑекÑÑ Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑом вмеÑÑо ÑпиÑка аÑгÑменÑов.
Function.prototype.construct = function (aArgs) {
var oNew = Object.create(this.prototype);
this.apply(oNew, aArgs);
return oNew;
};
ÐÑимеÑание:
ÐеÑод Object.create(), иÑполÑзованнÑй в ÑÑом пÑимеÑе, оÑноÑиÑелÑно новÑй. РкаÑеÑÑве алÑÑеÑнаÑивного ÑпоÑоба можно ÑаÑÑмоÑÑеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¼ÑканиÑ:
Function.prototype.construct = function (aArgs) {
var fConstructor = this,
fNewConstr = function () {
fConstructor.apply(this, aArgs);
};
fNewConstr.prototype = fConstructor.prototype;
return new fNewConstr();
};
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ:
function MyConstructor() {
for (var nProp = 0; nProp < arguments.length; nProp++) {
this["property" + nProp] = arguments[nProp];
}
}
var myArray = [4, "ÐÑивеÑ, миÑ!", false];
var myInstance = MyConstructor.construct(myArray);
alert(myInstance.property1); // вÑÐ²ÐµÐ´ÐµÑ 'ÐÑивеÑ, миÑ!'
alert(myInstance instanceof MyConstructor); // вÑÐ²ÐµÐ´ÐµÑ 'true'
alert(myInstance.constructor); // вÑÐ²ÐµÐ´ÐµÑ 'MyConstructor'
ÐÑимеÑание:
ÐÑÐ¾Ñ Ð½ÐµÑодной меÑод Function.construct() не бÑÐ´ÐµÑ ÑабоÑаÑÑ Ñ Ð½ÐµÐºÐ¾ÑоÑÑми ÑоднÑми конÑÑÑÑкÑоÑами (вÑоде конÑÑÑÑкÑоÑа Date, к пÑимеÑÑ). Ð ÑÑиÑ
ÑлÑÑаÑÑ
Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¼ÐµÑод Function.prototype.bind() (напÑимеÑ, пÑедÑÑавÑÑе, ÑÑо Ð²Ñ Ð¸Ð¼ÐµÐµÑе ÑледÑÑÑий маÑÑив, коÑоÑÑй можно иÑполÑзоваÑÑ Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑом Date: [2012, 11, 4]; в ÑÑом ÑлÑÑае Ð²Ñ Ð½Ð°Ð¿Ð¸ÑиÑе ÑÑо-Ñо вÑоде: new (Function.prototype.bind.apply(Date, [null].concat([2012, 11, 4])))() â Ñак или инаÑе, ÑÑо не ÑамÑй изÑÑнÑй ÑпоÑоб и, веÑоÑÑно, его не ÑÑÐ¾Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð² ÑабоÑем окÑÑжении).
ÐÑимеÑ: иÑполÑзование apply() и вÑÑÑоеннÑÑ
ÑÑнкÑий
Умное иÑполÑзование меÑода apply() позволÑÐµÑ Ð²Ð°Ð¼ иÑполÑзоваÑÑ Ð²ÑÑÑоеннÑе ÑÑнкÑии Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
задаÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
в пÑоÑивном ÑлÑÑае пÑиÑлоÑÑ Ð±Ñ Ð¿Ð¸ÑаÑÑ Ñикл по маÑÑÐ¸Ð²Ñ Ð·Ð½Ð°Ñений. РкаÑеÑÑве пÑимеÑа давайÑе иÑполÑзÑем Math.max()/Math.min() Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑималÑного/минималÑного знаÑÐµÐ½Ð¸Ñ Ð² маÑÑиве.
/* мин/Ð¼Ð°ÐºÑ ÑиÑла в маÑÑиве */
var numbers = [5, 6, 2, 3, 7];
/* иÑполÑзÑем apply к Math.min/Math.max */
var max = Math.max.apply(
null,
numbers,
); /* ÐÑо ÑквиваленÑно Math.max(numbers[0], ...)
или Math.max(5, 6, ...) */
var min = Math.min.apply(null, numbers);
/* ÑÑавним Ñ Ð¿ÑоÑÑÑм алгоÑиÑмом Ñ Ñиклом */
((max = -Infinity), (min = +Infinity));
for (var i = 0; i < numbers.length; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
Ðо бÑдÑÑе оÑÑоÑожнÑ: пÑи иÑполÑзовании меÑода apply() Ñаким обÑазом Ð²Ñ ÑиÑкÑеÑе вÑйÑи за пÑÐµÐ´ÐµÐ»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° колиÑеÑÑво аÑгÑменÑов в движке JavaScript. ÐоÑледÑÑÐ²Ð¸Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑнкÑии Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом аÑгÑменÑов (дÑмаеÑÑÑ, болÑÑе деÑÑÑи ÑÑÑÑÑ Ð°ÑгÑменÑов) ÑазлиÑаÑÑÑÑ Ð¾Ñ Ð´Ð²Ð¸Ð¶ÐºÐ° к Ð´Ð²Ð¸Ð¶ÐºÑ (JavaScriptCore Ð¸Ð¼ÐµÐµÑ Ð¶ÑÑÑко заÑиÑое огÑаниÑение на колиÑеÑÑво аÑгÑменÑов в 65536), поÑколÑÐºÑ ÑÑÐ¾Ñ Ð¿Ñедел (на Ñамом деле, ÑÑо пÑиÑода Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð»Ñбого ÑÑезвÑÑайно огÑомного ÑÑека) не опÑеделÑн. ÐекоÑоÑÑе движки бÑдÑÑ Ð²ÑкидÑваÑÑ Ð¸ÑклÑÑение. Ð¥Ñже Ñого, дÑÑгие пÑоÑÑо оÑбÑаÑÑваÑÑ ÑеалÑно пеÑеданнÑе ÑÑнкÑии аÑгÑменÑÑ ÑвеÑÑ
лимиÑа. (ÐÐ»Ñ Ð¸Ð»Ð»ÑÑÑÑаÑии поÑледнего ÑлÑÑаÑ: еÑли Ñакой движок Ð¸Ð¼ÐµÐµÑ Ð¾Ð³ÑаниÑение в ÑеÑÑÑе ÑлеменÑа [ÑеалÑное огÑаниÑение, конеÑно же, гоÑаздо вÑÑе], ÑÑо вÑглÑдело Ð±Ñ Ñак, как еÑли Ð±Ñ Ð² пÑимеÑе вÑÑе в меÑод apply() бÑли пеÑÐµÐ´Ð°Ð½Ñ Ð°ÑгÑменÑÑ 5, 6, 2, 3, а не веÑÑ Ð¼Ð°ÑÑив.) ÐÑли Ð²Ð°Ñ Ð¼Ð°ÑÑив знаÑений Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑаÑÑи до деÑÑÑков ÑÑÑÑÑ, иÑполÑзÑйÑе ÑмеÑаннÑй подÑ
од: пÑименÑйÑе ваÑÑ ÑÑнкÑÐ¸Ñ Ðº поÑÑиÑм маÑÑива:
function minOfArray(arr) {
var min = Infinity;
var QUANTUM = 32768;
for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
var submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
min = Math.min(submin, min);
}
return min;
}
var min = minOfArray([5, 6, 2, 3, 7]);
ÐÑимеÑ: иÑполÑзование apply() в «monkey-паÑÑинге»
ÐеÑод apply() Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÑÑим ваÑианÑом Ð´Ð»Ñ Â«monkey-паÑÑинга» вÑÑÑоеннÑÑ
в Firefox ÑÑнкÑий, либо JS библиоÑек. ÐÑÑÑÑ Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑÑнкÑÐ¸Ñ someobject.foo(), Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе измениÑÑ ÐµÑ Ñаким немного Ñ
акеÑÑким ÑпоÑобом:
var originalfoo = someobject.foo;
someobject.foo = function () {
// Ðелаем ÑÑо-Ñо до вÑзова ÑÑнкÑии
console.log(arguments);
// ÐÑзÑваем ÑÑнкÑÐ¸Ñ Ñак, как бÑдÑо Ð±Ñ Ð¾Ð½Ð° бÑла вÑзвана обÑÑнÑм обÑазом:
originalfoo.apply(this, arguments);
// Ðелаем ÑÑо-Ñо поÑле вÑзова ÑÑнкÑии.
};
ÐÑÐ¾Ñ Ð¼ÐµÑод оÑобенно Ñдобен, когда вам нÑжно оÑладиÑÑ ÑобÑÑиÑ, либо инÑеÑÑÐµÐ¹Ñ Ñ Ñем-Ñо, ÑÑо не Ð¸Ð¼ÐµÐµÑ API, вÑоде ÑазлиÑнÑÑ
ÑобÑÑий .on([event]..., напÑимеÑ, ÑеÑ
ÑÑо иÑполÑзÑÑÑÑÑ Ð² ÐнÑпекÑоÑе инÑÑÑÑменÑов ÑазÑабоÑÑика).
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-function.prototype.apply> |