Могу ли я поместить четыре функции в одну?

Я не уверен, правильно ли я это формулирую, но в основном я написал 4 функции (я должен построить калькулятор), и каждая функция предназначена для деления, сложения, умножения и вычитания. Можно ли как-нибудь добавить все эти "команды" в одну функцию вместо четырех отдельных?

Спасибо.

function add (num1, num2){
    var intOutput= parseInt(num1)+parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
}

function subtract (num1, num2){
    var intOutput= parseInt(num1)-parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
}

function multiply (num1, num2){
    var intOutput= parseInt(num1)*parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
}


function divide (num1, num2){
    var intOutput= parseInt(num1)/parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
}

7 ответов

Похоже, вам нужна общая функция, которая будет условно выполнять запрошенное действие. Примерно так должно работать:

function calculate(num1, num2, action)
{
    if (action == 'add') {
        //...
    } else if (action == 'subtract') {
        //...
    } else if (action == 'multiply') {
        //...
    } else if (action == 'divide') {
        //...
    }
}

РЕДАКТИРОВАТЬ: ради удобочитаемости и долгосрочной ремонтопригодности, вы все равно можете сохранить фактические действия в отдельных функциях и просто вызывать их из различных функций. if ветви.

Вы можете рефакторинг всего кода DOM как таковой:

function proc(op, num1, num2) {
    document.getElementById("output").innerHTML = op(parseInt(num1), parseInt(num2));
}

Затем с помощью этих простых помощников:

var addOp = function (a, b) { return a + b; };
var subOp = function (a, b) { return a - b; };
var multOp = function (a, b) { return a * b; };
var divOp = function (a, b) { return a / b; };

Вы можете делать любые операции по вашему желанию:

proc(addOp, num1, num2);
proc(subOp , num1, num2);
proc(multOp , num1, num2);
proc(divOp , num1, num2);
function calculate(type, num1, num2) {
    var _in  = parseInt(num1, 10),
        _out = parseInt(num2, 20),
        output = 0;

    switch(type) {
        case 'add':
            output = _in + _out;
            break;
        case 'subtract':
            output = _in - _out;
            break;
        case 'multiply':
            output = _in * _out;
            break;
        case 'divide':
            output = _in / _out;
            break;
    }

    document.getElementById("output").innerHTML = output;
}

использоваться как

calculate('add', 10, 20); // 30
calculate('multiply', 10, 20); // 200
// etc...

Если вы убедитесь, что строка является просто числом оператором и числом, вы можете использовать eval для развлечения (все, хотя eval - зло)

function calculate(str) {
    if (/\d+(\*|\-|\+|\/)\d+/.test(str))
        document.getElementById("output").innerHTML = eval(str);
}

Тогда вы могли бы просто сделать

calculate('20*10')
calculate('20+100')
calculate('1000/100')

FIDDLE

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

function calculateAndDisplay(num1, num2, operation) {
    var intOutput= operation(num1, num2);
    document.getElementById("output").innerHTML=intOutput;
}

function add(num1, num2) {
    calculateAndDisplay(num1, num2, function(a, b) { return a + b; });
}

...

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

function operate(n1,n2,op){
    var output;    
    switch(op){
        case 'add':
            output = n1+n2;
            break;
        case 'sub':
            output= n1-n2;
            break;
        case 'div':
            output = n1/n2;
            break;
        case 'mul':
            output = n1*n2;

    }
    document.getElementById('output').innerHtml = output
}

Поскольку это звучит как домашнее задание, я дам вам домашнее задание.

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

Например:

function helloJohn() {
    console.log('Hello John');
}

function helloJane() {
    console.log('Hello Jane');
}

function hello(name) {
    if (name === 'John') {
        helloJohn();
    } else if (name === 'Jane') {
        helloJane();
    }
}

Я мог бы легко изменить свой hello функция для включения helloJohn а также helloJane функциональность.

var Calculator = {
  add: function (num1, num2) {
    var intOutput= parseInt(num1)+parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
  },
  subtract: function (num1, num2) {
    var intOutput= parseInt(num1)-parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
  },
  multiply: function (num1, num2) {
    var intOutput= parseInt(num1)*parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
  },
  divide: function (num1, num2) {
    var intOutput= parseInt(num1)/parseInt(num2);
    document.getElementById("output").innerHTML=intOutput;
  }
};

Calculator.add(4, 5);
Calculator.divide(20, 10);
Другие вопросы по тегам