Код рефакторинга — переменная область видимости

У меня есть 3 кнопки, которые по-разному объединяют вводимый текст:

 var myTxtArea = document.getElementById('KWarea');
 myTxtArea.value = myTxtArea.value.replace(/^\s*|\s*$/g, '');
 var lines = $('#KWarea').val().replace(/\*/g, '').split('\n');
 $('#produce').click(function () {
     var endString = "";

     myTxtArea.value = myTxtArea.value.replace(/^\s*|\s*$/g, '');
     var lines = $('#KWarea').val().replace(/\*/g, '').split('\n');
     for (var i = 0; i < lines.length; ++i) {
         endString += '"*' + $.trim(lines[i]) + '*"' + ',' + '"* ' + lines[i] + ' *"' + ',';
         //   console.log(lines[i]);
     }
     var trimmedStr = endString.slice(0, -1);
     $('#result1').html("ctx.keywords MATCHES (" + trimmedStr + ")");
     $('#Strlength').html('Total string length: ' + trimmedStr.length);

 });

 $('#produce2').click(function () {
     var endString = "";
     for (var i = 0; i < lines.length; ++i) {
         endString += '"*' + $.trim(lines[i]) + '*"' + ',';
     }
     var trimmedStr = endString.slice(0, -1);
     $('#result1').html("ctx.keywords MATCHES (" + trimmedStr + ")");
     $('#Strlength').html('Total string length: ' + trimmedStr.length);

 });

 $('#produce3').click(function () {
     var endString = "";
     for (var i = 0; i < lines.length; ++i) {
         endString += '"' + $.trim(lines[i]) + '"' + ',';
     }
     var trimmedStr = endString.slice(0, -1);
     $('#result1').html("ctx.keywords MATCHES (" + trimmedStr + ")");
     $('#Strlength').html('Total string length: ' + trimmedStr.length);

 });

Я хотел бы не повторять снова и снова следующее:

  $('#result1').html("ctx.keywords MATCHES (" + trimmedStr + ")");
     $('#Strlength').html('Total string length: ' + trimmedStr.length);

Но trimmedStr зависит от endString, и я не могу провести рефакторинг без var undefined

Jsfiddle здесь

Большое спасибо


person Andrejs    schedule 20.06.2015    source источник
comment
Почему бы вам просто не создать отдельную функцию для этих двух строк?   -  person Filip Veličković    schedule 20.06.2015
comment
Если это работающий код, который вы хотите улучшить, для этого и нужен codereview.stackexchange.com.   -  person jfriend00    schedule 20.06.2015
comment
function name(){ /* этот код */ } и вызов name() внутри .click() не работает -> var undefined. Если я делаю что-то не так, пожалуйста, отредактируйте мою скрипку :)   -  person Andrejs    schedule 20.06.2015
comment
Спасибо, никогда не знал, что он существует (хотя я вижу, что он довольно новый).   -  person Andrejs    schedule 20.06.2015
comment
@jfriend00 jfriend00 Это звучит как конкретная проблема программирования (хотя код работает, есть конкретная цель его улучшения), я не думаю, что это не по теме переполнения стека. (Если вы хотите более подробно обсудить это, добро пожаловать в чат в 2nd Monitor - Чат для проверки кода. )   -  person Simon Forsberg    schedule 20.06.2015
comment
@AndreyDoronin: используйте параметр для той функции, в которую вы передаете строку   -  person Bergi    schedule 20.06.2015
comment
@SimonAndréForsberg - нигде в моем комментарии я не сказал, что это не по теме StackOverflow (поэтому, пожалуйста, не придумывайте то, чего я не говорил). Я предложил им получить помощь в обзоре кода, если они хотят, что кажется совершенно правильным комментарием, поскольку этот код можно улучшить множеством способов, помимо того, о чем спрашивал ОП.   -  person jfriend00    schedule 21.06.2015
comment
@ jfriend00 Нигде в моем комментарии я прямо не сказал, что вы сказали, что думали, что это не по теме переполнения стека;)   -  person Simon Forsberg    schedule 21.06.2015
comment
@SimonAndréForsberg - господи. Шутки в сторону? Вы просто пытаетесь аргументировать без конкретной цели или спорите? Напомните мне держаться подальше от codereview или когда-либо рекомендовать его. Все, я когда-либо есть горе.   -  person jfriend00    schedule 21.06.2015
comment
@jfriend00 Извините, все, что я хотел сделать, это помешать кто-то еще проголосовать за закрытие и прокомментировать, что я голосую за закрытие этого вопроса, потому что он принадлежит Code Review. Я не имел в виду ничего плохого. Этот вопрос мог бы быть хорошим вопросом CR, но это совсем другая история.   -  person Simon Forsberg    schedule 21.06.2015
comment
Я работал над исправлением вашего кода, но обнаружил несоответствие, которого не понимаю. Вы создаете глобальную переменную с именем lines, которую используют два ваших обработчика кликов, но другие обработчики кликов создают свою собственную локальную переменную с тем же именем. Это действительно то, что вы имеете в виду, или это ошибка?   -  person jfriend00    schedule 21.06.2015
comment
Да, это ошибка, просто забыл вынуть из 3-го клика. спасибо, что заметили.   -  person Andrejs    schedule 21.06.2015


Ответы (1)


Похоже, что немного больший рефакторинг может быть полезен. Что-то в этом роде?

function getInput () {
    var lines = $('#KWarea').val().split('\n');
    var plainKeywords = lines.map(function (line) {
        // Match the line for correct input string
        return line.match(/^\s*\**([a-z 0-9]+)\**\s*$/i)[1];  
    }).filter(function (word) {
        // No match -> discard line
        return word !== undefined;
    });
    return plainKeywords;
}

function getKeywords (type, word) {
    if(type == 1) return ['"*' + word + '*"', '"* ' + word + ' *"'];
    if(type == 2) return ['"*' + word + '*"'];
    return ['"' + word + '"'];
}

function showKeywords (type) {
    // Comma seperated list of keywords
    var output = getInput().reduce(function (memo, i) {
        return memo.concat(getKeywords(type, i));
    }, []).join(',');
    $('#result1').html('ctx.keywords MATCHES (' + output + ')');
    $('#Strlength').html('Total string length: ' + output.length);
}

 $('#produce').click(showKeywords.bind(null, 1));
 $('#produce2').click(showKeywords.bind(null, 2));
 $('#produce3').click(showKeywords.bind(null, 3));

http://jsfiddle.net/g8rsxmy3/5/

person Juho    schedule 20.06.2015
comment
Спасибо, именно такой код-ревью помогает мне стать лучше в программировании. - person Andrejs; 21.06.2015