Ответ 1
Просто создайте функцию, которая возвращает новую функцию b:
function getB(my1, my2) {
return function() {
a(my1, my2);
}
}
и используйте его следующим образом:
var b = getB(my1, my2);
У меня есть функция вроде
function a (p1, p2) { /* ... */ }
и в какой-то области хотите получить что-то вроде этого:
function b (/* no params! */) { return a (my1, my2) }
где my1 и my2 каким-то образом определены в этой области. Поэтому я должен получить безпараметрическую функцию b, которая при вызове вызывает a с фиксированными параметрами my1 и my2. Теперь, вопрос в том, почему это неправильно, и который:)
UPD: Хорошо, у меня были некоторые обратные вызовы в этих параметрах, теперь выяснилось, как обрабатывать их все. То, что я пропустил, это применить технику дважды. Спасибо.
Просто создайте функцию, которая возвращает новую функцию b:
function getB(my1, my2) {
return function() {
a(my1, my2);
}
}
и используйте его следующим образом:
var b = getB(my1, my2);
Напишите функцию, которая принимает my1 и my2 и создает функцию b:
function make_b(my1, my2){
return function b(){ return a(my1, my2);};
}
Почему это не так? Вы получаете сообщение об ошибке? Я попытался воспроизвести рабочий образец на основе вашего описания и того, что у меня есть, поэтому, возможно, вы можете разместить более подробный пример:
<script>
function a(p1, p2)
{
return 'hello ' + p1 + ' and ' + p2;
}
function b(my1,my2)
{
return function()
{
return a(my1,my2);
}
}
var wrapper=b();
alert(wrapper());
</script>
На основе вашего комментария к другому ответу я обновил свой пример, чтобы показать, как вы можете обернуть функцию.
Хорошо, поэтому я заменил их на переменные; -)
Я не уверен, правильно понял ли вы, но вы можете взглянуть на концепцию currying. В Javascript можно закрепить функцию, чтобы вы могли получить другую функцию с некоторыми или всеми параметрами, заданными.
Вы можете посмотреть реализацию здесь.
Если вы используете Prototype, вы можете получить функцию b таким образом.
var b = a.curry(arg1, arg2);
теперь вызов b()
совпадает с вызовом a(arg1, arg2)
Поместите значения в массив (или JSON) и верните массив.
function a (p1,p2) {
var my = []
my[0] = p1
my[1] = p2
return my
}
function b () {
return a(my1,nmy2)
}
Возможно, мне не хватает точки в вашем примере, я не знаю.
Кажется, что три части:
Определение:
function a(M, N) {
return M + N;
}
Определение b:
var X = 10;
var Y = 25;
var b = function() {
return a(X, Y);
}
Использование b:
var thirtyFive = b(); // thirtyFive = 35
В этом примере используется назначение обработчика события onclick во время загрузки страницы, чтобы продемонстрировать, как создать функцию ссылка, содержащая встроенные ссылки на локальные значения в функции настройки.
<html>
<head>
<title>Scope passing Test</title>
<script type="text/javascript">
// Your target function
function a(p1,p2) { alert("p1="+p1+ " p2="+p2); }
function yourSetupFunction()
{
// Declare some local variables that your "a()" function cannot see to test.
var my1 ="Look Ma" ;
var my2 ="No hands" ;
// Snag a reference to the <a id="testA"></a> element
var oAelement=document.getElementById("testA");
oAelement.addEventListener( "click" ,
(function(scopePass_My1,scopePass_My2)
{
return function()
{
a(scopePass_My1,scopePass_My2)
}
})(my1,my2) ,true);
}
</script>
</head>
<body onload="yourSetupFunction()">
<a id="testA" href="#" onclick="return false;">Click to Test</a>
</body>
</html>
Фактическая магия - всего несколько строк
(function(scopePass_My1,scopePass_My2)
{
return function()
{
a(scopePass_My1,scopePass_My2)
}
})(my1,my2)
Первый набор символов parens вызывает оценку содержимого для ссылки на функцию.
Второй набор парен... (my1, my2)... вызывает вызов функции который возвращает другую функцию, которая может видеть параметры, переданные в ... scopePass_My1, scopePass_My2... и может передать их вашей целевой функции a (p1, p2)
Надеюсь, что это поможет.