У вас почти есть правильная идея с eval(str)
, но это не то, что вы на самом деле хотите оценить.Если вы используете eval(str)
, это то же самое, что сказать eval(" 1, 'hello' ")
Однако, что вы действительно хотите сделать, это: eval("func(1, 'hello world'))
.
Для этого вы можете сделать:
eval(func.name + '(' + str.trim() + ')');
Здесь мы имеем:
func.name
: имя вызываемой функции.Вы можете, конечно, жестко закодировать это.(т.е. просто напишите "func (" + ...)
str.trim()
: аргументы, которые вы хотите передать в данную функцию. Здесь я также использовал .trim()
, чтобы удалить любыедополнительные пробелы вокруг строки.
Взгляните на фрагмент ниже. Здесь я в основном выписал приведенную выше строку кода, однако я использовал некоторые промежуточные переменные, чтобы помочь разобратькак именно это работает:
function func(myNum, myStr) {
console.log(myNum*2, myStr);
}
let str = " 1, 'hello, world'";
// Build the components for the eval:
let fncName = func.name;
let args = str.trim();
let fncStr = fncName + '(' + args + ')';
eval(fncStr);
В качестве альтернативы , если вы хотите передать только два аргумента, вы можете использовать .split(',')
в вашей строке, чтобы разбить строку на основе символа запятой,
.
Использование split для " 1, 'hello' "
даст вам такой массив a
:
let a = [" 1", "'hello'"];
Затем приведите вашу строку кцелое число и удалите дополнительные кавычки вокруг вашей строки, используя .replace(/'/g, '');
(замените все кавычки '
ничем ''
):
let numb = +a[0].trim(); // Get the number (convert it to integer using +)
let str = a[1].trim().replace(/'/g, ''); // get the string remove whitespace and ' around it using trim() and replace()
Теперь вы можете вызывать свою функцию, используя следующие две переменные:
func(numb, str);
function func(myNum, myStr) {
console.log('The number times 2 is:', myNum*2, "My string is:", myStr);
}
let arguments = " 1, 'hello' ";
let arr = arguments.split(',');
let numb = +arr[0].trim(); // Argument 1
let str = arr[1].trim().replace(/'/g, ''); // Argument 2
func(numb, str);