2013-07-03 3 views
0

Вот эта идея: я хочу, чтобы иметь возможность сделать так, чтобы я мог изменить порядок, в котором данные ввода имеют значение в функции. Допустим, что нормальная функция выглядит так:Можете ли вы эффективно сбрасывать порядок ввода функций?

var f = function(a,b,c,d){ 
    return a * b/c + d; 
} 

Я хочу, чтобы иметь возможность переопределить функцию, так что, когда пользователь вызывает f(w,x,y,z), если переменная (позволяет сказать changed) истинно, он действует так, как будто пользователь под названием f(w,z,y,x)! (Конкретно не в обратном порядке, просто другой порядок, чем исходная функция)

Если бы я хотел написать отдельную функцию, которая действовала таким образом, я мог бы сделать следующее:

var newF = function(a,b,c,d){ 
    if(changed === true){ 
     return f(c,d,b,a); 
    } 
    else{ 
     return f(a,b,c,d); 
    } 
} 

, а затем заменить все f звонков с звонками newF, но это не то, о чем я прошу.

Возможно ли переопределить функцию с тем же именем, что и фактическая функция, и как это сделать? Если я не могу, объясните, почему нет.

Объяснение:

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

+5

Я не уверен, я понимаю, почему вы хотели бы сделать это. Что вы надеетесь достичь, изменив порядок аргументов «на лету»? – Amy

+3

Это необходимо? наличие конкретной функции ведет себя по-разному на основе значения отключенной переменной, звучит как рецепт бедствия –

+8

Возможно, вместо принятия нескольких аргументов вы хотите, чтобы функция принимала один объект, где каждое свойство является аргументом. Тогда вызывающему не нужно беспокоиться о порядке. –

ответ

2
var oldF = f; 

f = function(...){ 
    // do stuff 
    oldF(...); 
}; 
1

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

4

Возможно ли переопределить функцию с тем же именем, что и фактическая функция, и как это будет сделано?

Да, вы можете просто присвоить его идентификатор снова:

f = function(a,b,c,d) { 
    if (changed) 
     return a * d/c + b; 
    else 
     return a * b/c + d; 
}; 

Если вам нужно вызвать реальную функцию, потому что вы не знаете его содержимое точно (но хотите, чтобы перехватить его параметры), вы можете сделать

f = (function(oldF) { 
    return function(a,b,c,d){ 
     if (changed) 
      return oldF(c,d,b,a); 
     else 
      return oldF(a,b,c,d); 
    }; 
})(f); 
+0

почему это в скобках? –

+0

Это функция самозапуска –

+0

Чтобы подчеркнуть, что это выражение, вызываемое сразу же. Они [не обязательно] (http://stackoverflow.com/q/17332911/1048572) на самом деле. – Bergi

0

Хорошо первый, до тех пор, как вы определили функцию следующим образом:

var f = function(...){...}; 

тогда вы можете легко его переопределить. Но когда вы делаете это:

function f(...){...} 

Объяснение Проще говоря, когда вы объявляете функцию с function f(...){... компилятор сначала ищет для каждой объявленной функции, способ затем запустить свой код. С другой стороны, объявляя переменную f, она сохраняет функцию во время выполнения не во время предварительной обработки. Следовательно, объявляя как это:

function f(){ 
    console.log('a'); 
}; 
f(); 
function f(){ 
    console.log('b'); 
} 

f(); 

Выведет b b, fiddle Хотя, как это:

var f = function() { 
    console.log('a'); 
}; 
f(); 
f = function() { 
    console.log('b'); 
} 

f(); 

Выведет a b, fiddle

Теперь, я никогда не ставил аргументы внутри exemples, потому что JS не заботится о размере типа и аргументов. Лучший способ имо это сделать так:

var myProject = {}; 

myProject.fn = { 

    f: function(args,options){ 
     //in your case while you need a,b,c,d you can use the args array to store them 
     //options to define the 'changed' thing or whatever you need 
     } 

} 
+2

Ум, но у него нет объявления функции? Btw, ваш второй фрагмент выводит 'a b' не' a a' – Bergi

+0

моя ошибка извините – TecHunter

0

Помимо «почему вы хотите», вы могли бы сделать что-то вроде этого:

var changed = false; 

var f = function(a,b) { 
    console.log("original function: " + a + "," + b); 
} 

f = (function(original) { 
    return function(a,b) { 
     console.log("new function"); 
     if (changed) { 
      console.log("order changed"); 
      original(b,a); 
     } 
     else { 
       original(a,b); 
     } 
    } 
})(f); 

f(1,2); 
changed = true; 
f(1,2); 

Выведет (в консоли):

new function 
original function: 1,2 
new function 
order changed 
original function: 2,1 

fiddle

Смежные вопросы