2017-01-19 44 views
18
function foo(x) { 
    console.log(arguments) 
} //foo(1) prints [1] 

amaOk işlevlerinin neden argümanlar dizisi yok? aynı şekilde çağrıldığında

var bar = x => console.log(arguments) 

aşağıdaki hatayı veriyor:

Uncaught ReferenceError: arguments is not defined 
+2

, ancak arguments' nesnesine sahip olmayan ok işlevleri. Yani, sorunuz yanlış bir beyan/varsayım yapıyor. 'Function' anahtar sözcüğü ile bildirilen düzenli anonim işlevler argümanlar' nesnesine sahip. – jfriend00

+3

Dil tasarım kararlarıyla ilgili sorular genellikle Yığın Taşması için uygun değildir. –

cevap

38
arguments dizi benzeri nesne başlamak için bir geçici çözüm olduğu için Ok fonksiyonları bu yok

ile, ES6 bir dinlenme parametresi ile çözüldü:

arguments burada hiçbir şekilde rezerve edilmemiştir ancak sadece seçilmiştir. Sen dilediğiniz diyebilirsiniz ve normal parametreler ile kombine edilebilir:

var test = (one, two, ...rest) => [one, two, rest]; 

Hatta başka bir yol gidebilir, bu fantezi gösterildiği geçerlidir:

O isimsiz fonksiyonlar değil
var fapply = (fun, args) => fun(...args); 
+1

Gerileme argümanlarının 'arguments' nesnesine olan ihtiyacı nasıl engellediğine dair iyi bir nokta. Dinlenme argümanlarıyla, gerçekte istediğiniz herhangi bir zamanda gerçek bir diziye sahip olabilirsiniz. Kullanılmadığı zaman dil yükü yoktur. – jfriend00

+0

Geri kalan operatörü kullandığınız için iyi çalışıyor gibi görünüyor. – Conqueror

+1

Bence bu bağlamda, '... argümanlar' * rest parametrelerini *, * rest argümanlarını * belirtmektedir. [* Array.of (... items) *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-array.of) "rest arguments" teriminin kullanıldığı yerler , [* String.fromCharCode (... codeUnits) *] 'da (http://ecma-international.org/ecma-262/7.0/index.html#sec-string.fromcharcode) "dinlenme parametreleri" terimi Kullanılmış. – RobG