2009-11-25 45 views
23

Bu diziyi, işlevin bir dizesi kümesi olarak geçirilmek üzere nasıl alabilirim? Bu kod çalışmıyor, ama ne yapmaya çalıştığımı gösteriyor.Bir diziyi ayrı bir argüman dizesine dönüştürme

var strings = ['one','two','three']; 

someFunction(strings.join("','")); // someFunction('one','two','three'); 

Teşekkürler!

cevap

41

apply()'u kullanın.

var strings = ['one','two','three']; 

someFunction.apply(null, strings); // someFunction('one','two','three'); 

sizin fonksiyon nesne kapsamı önem veriyorsa

, sen this yerine null ilk argüman olarak ayarlanmalıdır isterdim neyi geçmektedir.

+0

Ayrıca, 'null' çağrı için geçerli bir parametre değildir veya ES5'te geçerlidir. –

+1

Null, es5 için geçerli bir bağımsız değişkendir ve es3'te global nesne ile değiştirilir. Bazı uygulama farklılıkları olabilir ama null geçerli https://esdiscuss.org/topic/function-prototype-apply-function-prototype-call-with-undefined-or-null-as-thisarg –

11

Çözüm oldukça basittir, JavaScript'deki her işlevin, bir dizi olarak iletmek istediğiniz argümanları alan, "apply" adlı, onunla ilişkili bir yöntemi vardır.

Yani:

var strings = ["one", "two", "three"]; 
someFunction.apply(this, strings); 

'bu' geçerli bir nesne olmadan sayfasında onun sadece bir fonksiyon, daha sonra aksi takdirde null ayarlarsanız kapsamı, istediğiniz kapsamı geçtiğini gösterir çağırırken sahip olma yöntemi.

Buna karşılık, bir_işlev iç, böyle kodunuzu yazabiliriz:

var strings = ["one", "two", "three"]; 
someFunction(...strings); 

referansı: Bir özel 'strüktür' operatörünü kullanabilirsiniz ES6 JavaScript için

function someFunction() { 
    var args = arguments; // the stuff that was passed in 
    for(var i = 0; i < args; ++i) { 
    var argument = args[i]; 
    } 
} 
+0

Sadece referans veren argümanlar olduğuna dikkat edin. | JavaScript'inizin çoğunu (tüm?) tarayıcılarda yürütmeyi yavaşlatır. – sdwilsh

+2

Bu bir örnektir, bir performans ayarlama egzersizidir. – Michael