Yanıtlar:
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);
İçin MDN belgelerine bakın Function.prototype.apply()
.
Ortam ECMAScript 6'yı destekliyorsa, bunun yerine bir yayılma argümanı kullanabilirsiniz :
call_me(...args);
Neden tüm diziyi geçmiyor ve fonksiyonun içinde gerektiği gibi işlemiyorsunuz?
var x = [ 'p0', 'p1', 'p2' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
call_me
işleve bir çağrıdır . Sonunda noktalı virgül yok.
ES6 standardında , tam olarak bunu yapan yeni bir spread operatörü ...
var.
call_me(...x)
IE hariç tüm büyük tarayıcılar tarafından desteklenir.
Forma operatörü başka birçok yararlı şey yapabilir ve bağlantılı belgeler bunu göstermede gerçekten iyi bir iş çıkarır.
@KaptajnKold yanıtlamış olduğu gibi
var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);
Ayrıca call_me işlevi için her parametreyi tanımlamanız gerekmez. Sadece kullanabilirsinizarguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == 'p0',
// arguments[1] == 'p1',
// arguments[2] == 'p2'
}
Bunu not et
function FollowMouse() {
for(var i=0; i< arguments.length; i++) {
arguments[i].style.top = event.clientY+"px";
arguments[i].style.left = event.clientX+"px";
}
};
// ---------------------------
html sayfası
<body onmousemove="FollowMouse(d1,d2,d3)">
<p><div id="d1" style="position: absolute;">Follow1</div></p>
<div id="d2" style="position: absolute;"><p>Follow2</p></div>
<div id="d3" style="position: absolute;"><p>Follow3</p></div>
</body>
herhangi bir Args ile fonksiyon çağırabilir
<body onmousemove="FollowMouse(d1,d2)">
veya
<body onmousemove="FollowMouse(d1)">
function foo([a,b,c], d){
console.log(a,b,c,d);
}
foo([1,2,3], 4)
function foo(a, b, c, d){
console.log(a, b, c, d);
}
foo(...[1, 2, 3], 4)
Forma operatörünü kullanırken, iletilen son veya tek parametre olması gerektiğini unutmamalıyız. Yoksa başarısız olur.
function callMe(...arr){ //valid arguments
alert(arr);
}
function callMe(name, ...arr){ //valid arguments
alert(arr);
}
function callMe(...arr, name){ //invalid arguments
alert(arr);
}
Bir diziyi başlangıç argümanı olarak iletmeniz gerekiyorsa şunları yapabilirsiniz:
function callMe(arr, name){
let newArr = [...arr];
alert(newArr);
}
forma operatörünü daha temel bir biçimde kullanabilirsiniz
[].concat(...array)
dizileri döndüren ancak bağımsız değişken olarak geçmesi beklenen işlevler durumunda
Misal:
function expectArguments(...args){
return [].concat(...args);
}
JSON.stringify(expectArguments(1,2,3)) === JSON.stringify(expectArguments([1,2,3]))
Cevap zaten verildi, ama sadece bir parça kek vermek istiyorum. Ulaşmak istediğiniz şey method borrowing
JS bağlamında, bir nesneden bir yöntem aldığımızda ve onu başka bir nesne bağlamında çağırdığımızda denir . Dizi yöntemlerini almak ve bunları bağımsız değişkenlere uygulamak oldukça yaygındır. Sana bir örnek vereyim.
Bu nedenle, iki sayıyı bağımsız değişken olarak alan ve "süper güvenli" karma dizeyi döndüren "süper" karma işlevimiz var:
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
Şimdiye kadar iyi, ancak yukarıdaki yaklaşımla çok az sorunumuz var, kısıtlı, sadece iki sayı ile çalışıyor, bu dinamik değil, herhangi bir sayı ile çalışmasını sağlayalım ve bir dizi geçmek zorunda değilsiniz ( eğer hala ısrar ediyorsanız). Tamam, yeterince konuşalım, savaşalım!
Doğal çözüm arr.join
yöntemi kullanmak olacaktır :
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
Ah adamım. Ne yazık ki, bu işe yaramaz. Çünkü hash (arguments) diyoruz ve arguments nesnesi hem yinelenebilir hem de dizi benzeri, ancak gerçek bir dizi değil. Aşağıdaki yaklaşıma ne dersiniz?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
Hile denir method borrowing.
join
Normal bir diziden bir yöntem ödünç alıyoruz [].join.
ve [].join.call
bunu bağlamında çalıştırmak için kullanıyoruz arguments
.
Neden çalışıyor?
Çünkü yerel yöntemin iç algoritması arr.join(glue)
çok basittir.
Şartnameden neredeyse “olduğu gibi” alınmıştır:
Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
…Do so until this.length items are glued.
Return result.
Yani, teknik olarak bunu alır ve bunu [0], bu [1]… vb. Birleştirir. Kasıtlı olarak buna benzer dizilere izin verecek şekilde yazılmıştır (tesadüf değil, birçok yöntem bu uygulamayı takip eder). Bu yüzden aynı zamandathis=arguments.