Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как передать функцию с параметрами в качестве аргумента другой функции (https://javascript.ru/forum/misc/34507-kak-peredat-funkciyu-s-parametrami-v-kachestve-argumenta-drugojj-funkcii.html)

DragorWW 08.01.2013 10:37

Как передать функцию с параметрами в качестве аргумента другой функции
 
Есть следующая логика:
random = function (max) {
var min = 1;
return Math.floor(Math.random() * (max - min) + min)
}
someFunction = function (num) {
	var someString = 'numbers: '
	for (var a=0;a<=10;a++) {
		someString = someString + num
	} 
	console.log(someString)
}
someFunction(random(6))

Вернёт 'numbers: 66666666666' или 'numbers: 11111111111' и так далее.

Но мне нужно что бы функция каждый раз вызывалась, а не только первый раз при указание её.
Есть такой вариант, но мне он не очень нравиться:
random = function (max) {
var min = 1;
return Math.floor(Math.random() * (max - min) + min)
}
someFunction = function (num) {
	var someString = 'numbers: '
	for (var a=0;a<=10;a++) {
		someString = someString + num()
	} 
	console.log(someString)
}
someFunction(function() {return random(6)})

Вернёт то что нужно 'numbers: 52524414321'

Но опять же это не удобно, так как num не всегда должно быть функцией, а может быть числом, и тогда придётся писать так:
someFunction(function() {return 6})


Вообщем хочется некой эстетики в коде

Deff 08.01.2013 12:01

Цитата:

Сообщение от DragorWW
мне нужно что бы функция каждый раз вызывалась, а не только первый раз при указание её.

:)
Опишите нужный Вам процесс работы функции - Ваши хотелки неясны!
Что нужно то в итоге ?

1.Запускаем ...
2. ....
....
N-ное.....

DragorWW 08.01.2013 12:10

Цитата:

Сообщение от Deff (Сообщение 225960)
:)
Опишите нужный Вам процесс работы функции - Ваши хотелки неясны!
Что нужно то в итоге ?

нужно что бы вот это:
someFunction = function (num) {
    var someString = 'numbers: '
    for (var a=0;a<=10;a++) {
        someString = someString + num
    }
    console.log(someString)
}
someFunction(random(6))

работало так же как и вот это, и возвращало 'numbers: 52524414321',
someFunction = function () {
    var someString = 'numbers: '
    for (var a=0;a<=10;a++) {
        someString = someString + random(6)
    }
    console.log(someString)
}
someFunction()

Deff 08.01.2013 12:30

random = function (max) {
var min = 1;
return Math.floor(Math.random() * (max - min) + min)
}
someFunction = function (num) {
	var someString = 'numbers: '
	for (var a=0;a<=10;a++) {
		someString = someString + eval(num)
	} 
	alert(someString)
}
var X;
X = 'random(6)';
someFunction(X);

X = 6;
someFunction(X);

X = '\'Z\'';
someFunction(X);

DragorWW 08.01.2013 12:46

Цитата:

Сообщение от Deff (Сообщение 225965)
someString = someString + eval(num)

Спасибо, жаль что нет конструкции для передачи ссылку на переменную через переменную в самом языке на вроде & перед переменной как в php.
Без eval я так понимаю тут ни как ?

Deff 08.01.2013 12:51

DragorWW,
Да есть прототипы
Цитата:

Сообщение от DragorWW
Без eval я так понимаю тут ни как ?

Эт первое, что пришло на ум

devote 08.01.2013 13:02

Цитата:

Сообщение от Deff
Эт первое, что пришло на ум

someString = someString + (new Function('', 'return ' + num))();

не?

Deff 08.01.2013 13:18

devote,+

Работает, правда чуток напрягает двойные кавычки для строковых переменных;
random = function (max) {
var min = 1;
return Math.floor(Math.random() * (max - min) + min)
}
someFunction = function (num) {
	var someString = 'numbers: '
	for (var a=0;a<=10;a++) {
		someString = someString + (new Function('', 'return ' + num))();
	} 
	alert(someString)
}
var X;
X = 'random(6)';
someFunction(X);

X = 6;
someFunction(X);

X = '\'Z\'';
someFunction(X);


Кстать, devote, не глянешь темку ? = > http://javascript.ru/forum/project/3...er-frejjm.html

devote 08.01.2013 13:28

Цитата:

Сообщение от Deff
правда чуток напрягает двойные кавычки для строковых переменных;

ну дык избавится можно от них:

random = function (max) {
var min = 1;
return Math.floor(Math.random() * (max - min) + min)
}
someFunction = function (num) {
    var someString = 'numbers: '
    for (var a=0;a<=10;a++) {
        someString = someString + (new Function('x', 'try{return ' + num + '}catch(_e_){return x}'))(num);
    } 
    alert(someString)
}
var X;
X = 'random(6)';
someFunction(X);
 
X = 6;
someFunction(X);
 
X = 'Z';
someFunction(X);

Deff 08.01.2013 13:43

Цитата:

Сообщение от devote
ну дык избавится можно от них:

Симпатично!
Дзен-трансгуманист,
Про по условию тож думал изначально, но как то неизящно по длине и в плане понимания изменений (если комментов не),

Да и условия - жесткие, к примеру захотел внедрить объект или массив
(массив функций


Часовой пояс GMT +3, время: 04:32.