2016-04-03 19 views
0

Başka bir işlevin içinde işlev argümanlarını değiştirmeye çalışıyorum ve sonra onu callee işlevine döndürüyorum. Böyle bir şey çalışıyorum:Bir işlevin argümanlarını başka bir javascript işlevinden değiştirmenin bir yolu var mı?

function func(a,b,c) { 
    console.log(arguments, a, b, c); //[1, true, "a"] 1 true "a" 
    arguments[0] = 2; 
    console.log(arguments, a, b, c); //[2, true, "a"] 2 true "a" 
    arguments = ArgumentsToNumber.apply(this, arguments); 
    console.log(arguments, a, b, c); //[2, 1, NaN] 2 true "a" 
} 

function ArgumentsToNumber() { 
    for (let i = 0; i < arguments.length; i++) { 
    arguments[i] = Number(arguments[i]); 
    } 
    return arguments; 
} 

func(1, true, 'a'); 

Ben a, b ve c değişkenlerde değişiklikler istiyoruz.

+0

Neden 'func' içinde' array.map' kullanılmıyor? 'arguments = arguments.map ((argüman) => Number (argüman))' –

+1

@AkshatMahajan Bu bir hataya neden olur. argümanlar bir dizi değil –

+0

Bu iyi uygulama 'arguments [0] = 2' gibi görünmüyor. Muhtemelen argümanları öncelikle bir diziye dönüştürmek istersiniz. '[] .slice.call (arguments)' ya da bir şekilde onları üzerinde [] .map.call (argümanlar, geri arama) ' – elclanrs

cevap

1

yerine bir dizi benzeri apply içinde olarak kullanmak, Argümanlar kendisini itiraz geçmelidir: Başka bir işlev argümanları değişen kötü performansa sahip olduğunu

function func(a, b, c) { 
    console.log(a, b, c); // 1, true, "a" 
    arguments[0] = 2; 
    console.log(a, b, c); // 2, true, "a" 
    argumentsToNumber(arguments); 
    console.log(a, b, c); // 2, 1, NaN 
} 
function argumentsToNumber(args) { 
    for (let i = 0; i < args.length; i++) 
    args[i] = +args[i]; 
} 
func(1, true, 'a'); 

Not.

+0

Bunun gibi performans değişmez argümanlar ne kadar kötü? –

+1

@HenriCavalcante Örneğin http://www.jspatterns.com/arguments-considered-harmful/ – Oriol

+0

'arguments.callee' veya tüm öğeleri yavaşlatan tüm argümanlar nesnesini geçirme, ama yavaşlamayanlar bile kod çok http://www.3site.eu/jstests/arguments.callee.calls.html?times=50000 – dandavis

İlgili konular