Javascript параметры функции строка

Как передать шаблон строки в функцию

В таком случае получаю, что переменная name не определена. Смысл в том, чтобы использовать шаблон строки в функции.

@Regent не, он не о том. а то, что он хочет, скорее всего нельзя сделать. во всяком случае без кривоты

@Regent Это я понимаю, но мне нужно другое. Передать в функцию имя и шаблон. И уже в функции использовать это имя в шаблоне. Возможно ли это вообще?

@АлексейШиманский а, передать «шаблон» в функцию, чтобы потом в ней его вызывать для переданного значения.

4 ответа 4

Такого нормально сделать нельзя.

Правильно будет передавать не шаблон, а функцию, заполняющую этот шаблон:

function hiTo(name) < return `Hi $`; > var firstName = 'Mark'; var f = hiTo.bind(null, firstName); console.log(f());

Если же это попытка локализации, то можно самому подставлять значения, а не пользоваться шаблонными строками:

function hiTo(args, template) < return template.replace(/\$\<(\w+)\>/g, (m,n) => args[n] || m); > var firstName = 'Mark'; var f = hiTo.bind(null, ); console.log(f('Hi $')); console.log(f('Привет $'));

Самый простой способ — передавать функцию вместо строки:

var strf = name => `Hi, $!`; func("Mark", strf); function func(name, strf)

В более сложных случаях вам потребуется new Function (но следите чтобы туда не попадали недоверенные строки!):

var str = 'Hi, $!'; var strf = compile(str); func("Mark", strf); function func(name, strf) < console.log(strf(name)); >function compile(str)

Если даже имена переменных неизвестны заранее — придется воспользоваться устаревшей конструкцией with :

var str = 'Hi, $!'; var strf = compile(str); func(< name: "Mark" >, strf); function func(data, strf) < console.log(strf(data)); >function compile(str)

Но лучше все же до такого не доводить и остановиться на первом варианте.

@Qwertiy что же до . keys — то обратите внимание что я разделяю компиляцию шаблона и его использование. При таком подходе этот самый список keys придется составлять вручную, что еще сильнее все усложнит.

Простым таким способом, как у вас в вопросе, сделать так нельзя (или я не знаю как). Придется городить разные конструкции или костыли. Пример:

var template = function(tpl, args) < var keys = Object.keys(args), fn = new Function(. keys, 'return `' + tpl.replace(/`/g, '\\`') + '`'); return fn(. keys.map(x =>args[x])); >; function test() < var myTpl = 'Hello $and $'; console.log(template(myTpl, )); > test();

Но как по мне, так проще для шаблонов в таком случае использовать банально replace по регулярке

» template(myTpl, name=firstName) « — глобальные переменные? Что-то вообще не понимаю, чем этот ответ лучше eval’а.

@Qwertiy именно поэтому считаю это всё неправильным, хоть и худо бедно работает. Как я писал — лучше сделать вырез по правильной регулярке + иметь соглашение по правильному оформлению шаблонов

@MarkL7 не спешите отмечать галкой ответ. может быть кто что еще порекомендует. ибо это всё не так просто. вообще дельный совет — использовать готовые шаблонизаторы имхо)) либо правильную регулярку для заранее обозначенного в стандарте шаблона

Этот пример делает совершенно не то что написано! Конструкция name=firstName создает глобальную переменную name , которая и используется шаблоном. А . rest можно вовсе убрать из кода — он ни на что не влияет.

Источник

Javascript параметры функции строка

Функция в JavaScript может принимать параметры. Параметры представляют способ передачи в функцию данных. Параметры указываются в скобках после названия функции.

Например, определим простейшую функцию, которая принимает один параметр:

function print(message) < console.log(message); >print("Hello JavaScript"); print("Hello METANIT.COM"); print("Function in JavaScript");

Функция print() принимает один параметр — message. Поэтому при вызове функции мы можем передать для него значение, например, некоторую строку:

Передаваемые параметрам значения еще называют аргументами.

При этом в отличие от ряда других языков программирования мы в принципе можем не передавать значения параметрам. Например:

function print(message) < console.log(message); >print();

Если параметру не передается значение, тогда он будет иметь значение undefined .

Если функция принимает несколько параметров, то они перечисляются через запятую:

function sum(a, b) < const result = a + b; console.log(result); >sum(2, 6); // 8 sum(4, 5); // 9 sum(109, 11); // 120

При вызове функции с несколькими параметрами значения передаются параметрам по позиции. То есть первое значение передается первому параметру, второе значение — второму и так далее. Например, в вызове:

Число 2 передается параметру a , а число 6 — параметру b .

Необязательные параметры и значения по умолчанию

Функция может принимать множество параметров, но при этом часть или все параметры могут быть необязательными. Если для параметров не передается значение, то по умолчанию они имеют значение «undefined». Однако иногда бывает необходимо, чтобы параметры обязательно имели какие-то значения, например, значения по умолчанию. До стандарта ES6 необходимо было проверять значения параметров на undefined:

function sum(x, y) < if(y === undefined) y = 5; if(x === undefined) x = 8; const z = x + y; console.log(z); >sum(); // 13 sum(6); // 11 sum(6, 4) // 10

Здесь функция sum() принимает два параметра. При вызове функции мы можем проверить их значения. При этом, вызывая функцию, необязательно передавать для этих параметров значения. Для проверки наличия значения параметров используется сравнение со значением undefined .

Также мы можем напрямую определять для параметров значения по умолчанию:

function sum(x = 8, y = 5) < const z = x + y; console.log(z); >sum(); // 13 sum(6); // 11 sum(6, 4) // 10

Если параметрам x и y не передаются значения, то они получаются в качестве значений числа 5 и 10 соответствено. Такой способ более лаконичен и интуитивен, чем сравнение с undefined.

При этом значение параметра по умолчанию может быть производным, представлять выражение:

function sum(x = 8, y = 10 + x) < const z = x + y; console.log(z); >sum(); // 26 sum(6); // 22 sum(6, 4) // 10

В данном случае значение параметра y зависит от значения x.

Массив arguments

При необходимости мы можем получить все переданные параметры через глобально доступный массив arguments :

function sum() < let result = 0; for(const n of arguments) result += n; console.log(result); >sum(6); // 6 sum(6, 4) // 10 sum(6, 4, 5) // 15

При этом даже не важно, что при определении функции мы не указали никаких параметров, мы все равно можем их передать и получить их значения через массив arguments .

Неопределенное количество параметров

С помощью оператора . (многоточие) мы можем указать, что с помощью параметра можно передать переменное количество значений:

function display(season, . temps) < console.log(season); for(index in temps)< console.log(temps[index]); >> display("Весна", -2, -3, 4, 2, 5); display("Лето", 20, 23, 31);

В данном случае второй параметр . temps указывает, что вместо него можно передать разное количество значений. В самой функции temps фактически представляет массив переданных значений, которые мы можем получить. При этом несмотря на это, при вызове функции в нее передается не массив, а именно отдельные значения.

Весна -2 -3 4 2 5 Лето 20 23 31

Функции в качестве параметров

Функции могут выступать в качестве параметров других функций:

function sum(x, y) < return x + y; >function subtract(x, y) < return x - y; >function operation(x, y, func) < const result = func(x, y); console.log(result); >console.log("Sum"); operation(10, 6, sum); // 16 console.log("Subtract"); operation(10, 6, subtract); // 4

Функция operation принимает три параметра: x, y и func. func — представляет функцию, причем на момент определения operation не важно, что это будет за функция. Единственное, что известно, что функция func может принимать два параметра и возвращать значение, которое затем отображается в консоли браузера. Поэтому мы можем определить различные функции (например, функции sum и subtract в данном случае) и передавать их в вызов функции operation.

Источник

Читайте также:  Using python library in java
Оцените статью