2011-06-18 32 views
31

JavaScript işlevi sınırsız bağımsız değişken alabilir mi? Böyle şey:Bir JavaScript işlevinde sınırsız bağımsız değişkenler

testArray(1, 2, 3, 4, 5...); 

Ben çalışıyorum:

var arr = []; 
function testArray(A) { 
    arr.push(A); 
} 

Ama bu işe yaramazsa (çıkış sadece ilk argümandır). Ya tek yoldur:

function testArray(a, b, c, d, e...) { 

} 

Teşekkür

+0

, yapabilirsin tek bir parametre - "sınırsız" konteynırı (veya nesne gibi) ve sonra sadece her şeyi dizi olarak iletin, sadece "... ([one_arg])" ... –

+0

Doğrudan soruyu cevaplamak için not edin, [Hayır yapamazsın.] (Http: // stackoverflow.com/questions/22747068/is-there-a-max-number-of-arguments-javascript-functions-can-kabul) – Kaiido

cevap

49

sen sözde "argümanlar" başvurabileceğiniz bir garip "sihirli" değişken vardır:

function manyArgs() { 
    for (var i = 0; i < arguments.length; ++i) 
    alert(arguments[i]); 
} 

O bir dizi gibi , ama değil bir dizi. Aslında çok fazla kullanmamanız çok garip. Yaygın bir uygulama, bir gerçek diziye bunun değerlerini elde etmektir: o örnekte

function foo() { 
    var args = Array.prototype.slice.call(arguments, 0); 
    // ... 

, "args" garabeti hiçbiri olmadan normal bir dizi olacaktır. "Argümanlar" ile ilgili her türlü kötü problem vardır ve ECMAScript 5'te işlevselliği kısıtlanır.

düzenlemek — emin .slice() işlevini kullanarak uygun olsa da, bir fonksiyonun dışına arguments nesne geçirerek çok, optimizasyonu için baş ağrısı neden olur çıkıyor böylece hiç optimize olsun olmayabilir yapmak işlevleri. bir diziye arguments çevirmek kolay ve basit bir yolu bu nedenle

function foo() { 
    var args = []; 
    for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i]; 
    // ... 
} 

More about arguments and optimization.

+0

Tüm cevaplar için teşekkürler! – rhavd

+3

"Sihirli" veya garip bir şey yoktur, argüman nesnesi ECMA-262'de tanımlanmıştır. Bir diziyle sahip olduğu tek benzerlik, uzunluk özelliğinin en yüksek sayısal özellik adından bir diğeri olmasıdır. Bunun dışında, sadece özellikleri olan bir nesne. – RobG

+5

Ben şiirsel davranıyordum :-) Ve "argümanlar" değişkeni * garip - garip - aynı zamanda "callee" özelliği gibi şeyler var. – Pointy

1
function toArray() { 
    return arguments; 
} 

var myargs = toArray(1, 2, 3, 4, 5, 6); 

arguments anahtar kelime her js fonksiyonu ECMAScript'e 2015 itibarı

+0

'arguments' türden değil 'type'' Array ', sadece bir çeşit“ tekrarlanabilir ”ve JS tarafında oldukça gevşek. –

1
var arr = []; 
function testArray() { 
    Array.prototype.push.apply(arr, arguments); 
} 
10

mevcuttur (ya da ES6) biz de bize argümanları yönetmek için biraz daha temiz bir yol veren rest parameters erişim hakkına sahibiz:

function foo(a, b, ...others) { 
    console.log("a and b are ", a, b); 

    for (let val of others) { 
     console.log(val); 
    } 
} 

foo(1, 2, 3, 4, 5); 

Bu yazı yazıldığı sırada, bu, Chrome 47+, Firefox 15+ ve Edge tarafından desteklenir. Bu özellik ayrıca, Babel ve TypeScript aracılığıyla ES5'e aktarılarak da kullanılabilir.

+1

Teşekkürler, bu tam olarak aradığım şey. Özellikle MDN bağlantısı, sadece adını hatırlayamadım. :) – Noitidart

1

ECMAScript'e 6 ile, argümanlar sözdizimi geri kalanını kullanabilirsiniz:

const testArray = (...args) => { 
    console.log(args); 
}; 

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
0

Ayrıca sadece size çirkin döngü tasarruf "yayınlamanız" olabilir: Bir alternatif olarak

var getArguments = function() { 
    return arguments; 
}; 

var foo = getArguments(1,2,3,4); 

// console.log(foo.slice()); => TypeError: foo.slice is not a function 

var foo = Object.values(foo); 

console.log(foo); // => [ 1, 2, 3, 4 ] 

foo.push(5); 

console.log(foo); // => [ 1, 2, 3, 4, 5 ] 
İlgili konular