2016-04-03 91 views
0

我試圖改變另一個函數內的函數參數,然後將其返回給被調用函數。我想是這樣的:有沒有辦法從另一個javascript函數改變函數的參數?

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'); 

我想在abc變量的變化。

+0

爲什麼不在'func'中使用'array.map'? 'arguments = arguments.map((argument)=> Number(argument))' –

+1

@AkshatMahajan這會引發錯誤。參數不是數組 –

+0

這看起來不像好的練習'參數[0] = 2'。您可能首先要將參數轉換爲數組。 ''.slice.call(arguments)''或以某種方式映射它們,比如'[] .map.call(參數,回調)' – elclanrs

回答

1

你必須通過參數對象本身,而不是使用它作爲一個數組,像apply

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'); 

注意,在另一個函數變化的參數有糟糕的表現。

+0

這樣的性能改變參數有多糟? –

+1

@HenriCavalcante查看例如http://www.jspatterns.com/arguments-considered-harmful/ – Oriol

+0

它是'arguments.callee'或傳遞整個'arguments'對象減慢速度,但即使那些不會減慢代碼非常多。 http://www.3site.eu/jstests/arguments.callee.calls.html?times=50000 – dandavis

相關問題