Baseline Widely available
ÐбÑие ÑведениÑÐеÑод 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]...
, напÑимеÑ, ÑеÑ
ÑÑо иÑполÑзÑÑÑÑÑ Ð² ÐнÑпекÑоÑе инÑÑÑÑменÑов ÑазÑабоÑÑика).
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