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ë 7ì.
apply() ë©ìëë 주ì´ì§ this ê°ê³¼ ë°°ì´ (ëë ì ì¬ ë°°ì´ ê°ì²´) ë¡ ì ê³µëë arguments ë¡ í¨ì를 í¸ì¶í©ëë¤.
ì°¸ê³ :
ì´ í¨ìì 구문ì ê±°ì call() 구문과 ì ì¬í©ëë¤. 근본ì ì¸ ì°¨ì´ì ì call() ì í¨ìì ì ë¬ë ì¸ì 리ì¤í¸ë¥¼ ë°ëë° ë¹í´, apply() ë ì¸ìë¤ì ë¨ì¼ ë°°ì´ì ë°ëë¤ë ì ì
ëë¤.
ìëí´ ë³´ê¸°
const numbers = [5, 6, 2, 3, 7];
const max = Math.max.apply(null, numbers);
console.log(max);
// Expected output: 7
const min = Math.min.apply(null, numbers);
console.log(min);
// Expected output: 2
구문
func.apply(thisArg, [argsArray]);
매ê°ë³ì
thisArg-
ìµì .
func를 í¸ì¶íëë° ì ê³µëthisì ê°.thisë ë©ìëì ìí´ ì¤ì ë¡ ë³´ì¬ì§ë ê°ì´ ìë ì ììì ì ìí©ëë¤. ë©ìëê° non-strict mode ì½ëì í¨ìì¼ ê²½ì°,nullê³¼undefinedê° ì ì ê°ì²´ë¡ ëì²´ëë©°, 기본 ê°ì ì íë©ëë¤. argsArray-
ìµì .
funcì´ í¸ì¶ëì´ì¼ íë ì¸ì를 ì§ì íë ì ì¬ ë°°ì´ ê°ì²´, í¨ìì ì ê³µë ì¸ìê° ìì ê²½ì°nullëëundefined. ECMAScript 5 ì ììì¼ë¡ ì´ë¬í ì¸ìë¤ì ë°°ì´ ëì ì ë¤ë¦ ì ì¬ ë°°ì´ ê°ì²´ë¡ ì¬ì©ë ì ììµëë¤. ìëì ë¸ë¼ì°ì í¸íì± ì 보를 ë³´ì¸ì.
ë°íê°
ì§ì í this ê°ê³¼ ì¸ìë¤ë¡ í¸ì¶í í¨ìì ê²°ê³¼.
ì¤ëª
ì´ë¯¸ ì¡´ì¬íë í¨ì를 í¸ì¶í ë ë¤ë¥¸ this ê°ì²´ë¥¼ í ë¹í ì ììµëë¤. this ë íì¬ ê°ì²´, í¸ì¶íë ê°ì²´ë¥¼ 참조í©ëë¤. apply 를 ì¬ì©í´, ìë¡ì´ ê°ì²´ë§ë¤ ë©ìë를 ì¬ìì±í íììì´ í ë²ë§ ìì±í´ ë¤ë¥¸ ê°ì²´ì ìììí¬ ì ììµëë¤.
apply ë ì§ìëë ì¸ìì íì
ë§ ì ì¸íë©´ call() ê³¼ ë§¤ì° ì ì¬í©ëë¤. ì¸ì(íë¼ë¯¸í°)ì 리ì¤í¸ ëì ì¸ìë¤ì ë°°ì´ì ì¬ì©í ì ììµëë¤. ëí apply 를 ì¬ì©í´, ë°°ì´ ë¦¬í°ë´ì´ë (ì, func.apply(this, ['eat', 'bananas']), Array ê°ì²´ (ì, func.apply(this, new Array('eat', 'bananas'))) 를 ì¬ì©í ì ììµëë¤.
argsArray íë¼ë¯¸í°ë¥¼ ìí arguments 를 ì¬ì©í ìë ììµëë¤. arguments ë í¨ìì ì§ì ë³ìì
ëë¤. ì´ë í¸ì¶ë ê°ì²´ì ì§ì ëì§ ìì 모ë ì¸ìì ëí´ ì¬ì©í ì ììµëë¤. ë°ë¼ì, apply ë©ìë를 ì¬ì©í ë í¸ì¶ë ê°ì²´ì ì¸ì를 ì íìê° ììµëë¤. arguments 를 ì¬ì©í´ 모ë ì¸ìë¤ì í¸ì¶ë ê°ì²´ë¡ ì ë¬í ì ììµëë¤. ê·¸ë¼ í¸ì¶ë ê°ì²´ë ê·¸ ì¸ìë¤ì ì²ë¦¬í ì ìê² ë©ëë¤.
ECMAScript 5ë² ì§¸ íì ììì¼ë¡, 모ë ì ì¬ ë°°ì´ ê°ì²´ íì
ì ì¬ì©í ì ìì¼ë©°, ì¤ì ë¡ ì´ë íë¡í¼í° length ì ë²ì (0..length-1) ë´ì ì ì íë¡í¼í°ë¥¼ ê°ë ë¤ë ê²ì ì미í©ëë¤. ì를 ë¤ë©´, ì´ì NodeList ëë { 'length': 2, '0': 'eat', '1': 'bananas' } ì ê°ì 커ì¤í
ê°ì²´ë¥¼ ì¬ì©í ì ììµëë¤.
ì°¸ê³ : Chrome 14ì Internet Explorer 9를 í¬í¨í ëë¶ë¶ì ë¸ë¼ì°ì ë ìì§ ì ì¬ë°°ì´ê°ì²´ë¥¼ applyì ì¬ì©í ì ìì¼ë©° ì¤ë¥ê° ì¶ë ¥ë©ëë¤.
ìì
>ë°°ì´ì ë°°ì´ì ë¶ì´ê¸° ìí´ apply ì¬ì©í기
push 를 ì¬ì©íì¬ ìì를 ë°°ì´ì ì¶ê° í ì ììµëë¤. push ë ê°ë³ ì¸ì를 íì©í기 ë문ì ì¬ë¬ ìì를 ëìì ì¶ê° í ì ììµëë¤. ê·¸ë¬ë push ì ë°°ì´ì ì ë¬íë©´ ìì를 ê°ë³ì ì¼ë¡ ì¶ê°íë ëì ì¤ì ë¡ í´ë¹ ë°°ì´ì ë¨ì¼ ììë¡ ì¶ê°íë¯ë¡ ê²°êµ ë°°ì´ ë´ë¶ì ë°°ì´ë¡ ëë©ëë¤. ê·¸ê²ì´ ì°ë¦¬ê° ìíë ê²ì´ ìëë¼ë©´? ì´ ê²½ì° concat ì ì°ë¦¬ê° ìíë ëìì íì§ë§ ì¤ì ë¡ë 기존 ë°°ì´ì ì¶ê°ëì§ ìê³ ì ë°°ì´ì ë§ë¤ì´ ë°í í©ëë¤. ê·¸ë¬ë ì°ë¦¬ë 기존 ë°°ì´ì ì¶ê°íê³ ì¶ììµëë¤ ... ê·¸ë¼ ì´ì ì´ì©ì£ ? 루í를 ìì± í ê¹ì? ë¶ëª
í ìëì£ ?
ë°©ë²ì apply !
var array = ["a", "b"];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
apply ì ë´ì¥í¨ì ì¬ì©
apply 를 ë³´ë¤ í¨ê³¼ì ì¼ë¡ ì´ì©íë©´ ì¼ë¶ ë´ì¥ í¨ìë ì´ë¤ ìì
ì ëí´ìë ë°°ì´ê³¼ 루íìì´ ì½ê² ì²ë¦¬ë©ëë¤. ë¤ì ìì ììë ë°°ì´ìì ìµëê°ê³¼ ìµìê°ì 구í기 ìí´ Math.max/Math.min í¨ì를 ì´ì©íê³ ììµëë¤.
// min/max number in an array
var numbers = [5, 6, 2, 3, 7];
// using Math.min/Math.max apply
var max = Math.max.apply(null, numbers);
// ì´ë Math.max(numbers[0], ...) ëë Math.max(5, 6, ...)
// ì ê±°ì ê°ì
var min = Math.min.apply(null, numbers);
// vs. simple loop based algorithm
((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), ìíì´ í¹ë³í ì í´ì ¸ ìì§ ì기 ë문ì
ëë¤. ì´ë¤ ìì§ì ìì¸ë¥¼ ëì§ëë¤. ë ì¬í ê²½ì°ë ì¤ì í¨ìì ì¸ì를 ì ë¬íììë ë¶êµ¬íê³ ì°¸ì¡°í ì ìë ì¸ìì ì를 ì ííê³ ìë ê²½ì°ë ììµëë¤(ì´ë¬í ìì§ì ëí´ ë ìì¸í ì¤ëª
íë©´, ê·¸ ìì§ì´ argumentsì ìíì 4ê°ë¡ íë¤ê³ íë©´[ì¤ì ìíì ë¬¼ë¡ ë ìì¼ ê²ì
ëë¤], ì ìì ì½ëì ì ì²´ ë°°ì´ì´ ìëë¼ 5, 6, 2, 3 ë§ apply ì ì ë¬ëì´ ì¨ ê²ì²ë¼ ìëí©ëë¤).
ë§ì½ ì¬ì©íë ë°°ì´ ë³ìì ìê° ìë§ì ì´ê³¼íë ê²½ì°ìë ë³µí©ì ì¸ ì ëµì ê°êµ¬í´ì¼í ê²ì ëë¤:í ë²ì ì ë¬í ë°°ì´ì ë¶í íì¬ ì¬ì©í기:
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 ì¬ì©
Java ì ì ì¬íê², ê°ì²´ë¥¼ ìí constructors ì²´ì´ëì ìí´ apply 를 ì¬ì©í ì ììµëë¤. ë¤ì ìì ìì ì¸ì 리ì¤í¸ ëì ìì±ìë¡ ì ì¬ ë°°ì´ ê°ì²´ë¥¼ ì¬ì©í ì ìê² í´ì£¼ë construct ë¼ë ì ì Function ë©ìë를 ìì±í ê²ì
ëë¤.
Function.prototype.construct = function (aArgs) {
var oNew = Object.create(this.prototype);
this.apply(oNew, aArgs);
return oNew;
};
ì°¸ê³ :
ììì ì¬ì©ë Object.create() ë©ìëë ìëì ì¼ë¡ ìë¡ì´ ê²ì
ëë¤. ëìì¼ë¡, ë¤ì ì ê·¼ë² ì¤ íë를 ê³ ë ¤íì¸ì.
Object.prototype.__proto__ ì¬ì©:
Function.prototype.construct = function (aArgs) {
var oNew = {};
oNew.__proto__ = this.prototype;
this.apply(oNew, aArgs);
return oNew;
};
í´ë¡ì ¸ ì¬ì©:
Function.prototype.construct = function(aArgs) {
var fConstructor = this, fNewConstr = function() {
fConstructor.apply(this, aArgs);
};
fNewConstr.prototype = fConstructor.prototype;
return new fNewConstr();
};
Function ìì±ì ì¬ì©
Function.prototype.construct = function (aArgs) {
var fNewConstr = new Function("");
fNewConstr.prototype = this.prototype;
var oNew = new fNewConstr();
this.apply(oNew, aArgs);
return oNew;
};
ì¬ì© ìì
function MyConstructor() {
for (var nProp = 0; nProp < arguments.length; nProp++) {
this["property" + nProp] = arguments[nProp];
}
}
var myArray = [4, "Hello world!", false];
var myInstance = MyConstructor.construct(myArray);
console.log(myInstance.property1); // logs 'Hello world!'
console.log(myInstance instanceof MyConstructor); // logs 'true'
console.log(myInstance.constructor); // logs 'MyConstructor'
ì림: ë¤ì´í°ë¸ê° ìë Function.construct ë©ìëë Date ì ê°ì ì¼ë¶ ë¤ì´í°ë¸ ìì±ìì ëìíì§ ìì ê²ì
ëë¤. ê·¸ë° ê²½ì°, Function.prototype.bind ë©ìë를 ì¬ì©í´ì¼ í©ëë¤. ì를 ë¤ì´, ë¤ìê³¼ ê°ì ë°°ì´ì´ ìë¤ê³ í ë, Date ìì±ì: [2012, 11, 4] ì í¨ê» ì¬ì©ëë ¤ë©´ ë¤ìê³¼ ê°ì´ ìì±í´ì¼ í©ëë¤: new (Function.prototype.bind.apply(Date, [null].concat([2012, 11, 4])))(). ì´ë ê°ì¥ ì¢ì ë°©ë²ì´ ìëë©°, ì´ë¤ ìì© íê²½ììë ì¬ì©ëì§ ìì ì ììµëë¤.
ëª ì¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-function.prototype.apply> |