2015-09-11 1 views
2

я заявил в одном файле сценарий следующей подстроки функции заменой:Почему String.Prototype replace не работает внутри вложенных функций?

String.prototype.replaceAt = function(index, character) { 
    index = parseInt(index, 10); 
    return this.substr(0, index) + character + this.substr(index + character.length); 
} 

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

Если я использую эту функцию внутри вложенных функций, более точно у меня есть функция внутри другой функции, и я вызываю «replaceAt» внутри второй функции, она не работает и обрезает все символы после «индекса», указанного в "replaceAt". Я также указываю, что это скрипт содержимого в расширении Chrome.

Пример (работает нормально вне функции, в основном файле):

var h = '000000'; 
h = h.replaceAt(3, "1"); 
console.log(h); 

Пример (обрезает все после того, как "индекс"):

function do_lut() { 
    temp = '000000000000000'; 

    function nfu_change(e, i) { 
     if (e.checked) { 
      if (temp != null) { 
       console.log(i + " - " + temp); 
       temp = temp.replaceAt(i, "1"); 
      } else { temp = '000000000000000'.replaceAt(i, "1"); } 
         } 
     else { if(temp!=null) {temp = temp.replaceAt(i,"0");} else {temp = new String('000000000000000');} } 
     console.log(i+" - "+temp); 
     } 
    } 

for(i=0;i<15;i++) 
{ 
    nfu[i] = document.createElement('INPUT'); 
    nfu[i].type = 'checkbox'; 
    nfu[i].id = Math.floor((Math.random() * 100000000) + 1).toString(); 
    nfu[i].name = i.toString(); 
    nfu[i].onchange = function(e) {nfu_change(e.target,e.target.name);} 
} 
} 

выше создаст список CheckBox входов и когда пользователь проверяет/снимает флажок, соответствующий индекс (соответствующий вводу в списке) будет изменен на «0» или «1» true/false в «temp», который будет перезаписан в cookie. Таким образом, «nfu_change» условно называется изменением статуса флажка.

+2

Это может быть яснее увидеть, что происходит, если вы можете воспроизвести это как легко работоспособный минимальный пример, возможно, используя сайты функций стека Snippets. –

+1

Отправьте полный код, пожалуйста. Это может быть проблема контекста. – Superdrac

+1

Как называется 'nfu_change()'? ** Что такое 'i' **? Что делает '000000000000000'.replaceAt (i," 1 ")' дает вам 'temp' (и/или что делает' console.log (i + "-" + temp); 'show you)? Какой '.replaceAt' дает вам проблему? Как бы то ни было, я не вижу здесь ничего плохого. –

ответ

2

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


Редактировать Я думаю, что выше гипотеза неверна.

Я смог воспроизвести вашу проблему, вызвав функцию replaceAt со строкой для индекса.

String.prototype.replaceAt = function (index, character) { 
    return this.substr(0, index) + character + this.substr(index + character.length); 
} 

alert("abc".replaceAt(1, "B")); // aBc 
alert("abc".replaceAt("1", "B")); //aB 

Вот решение:

String.prototype.replaceAt = function (index, character) { 
    index = parseInt(index, 10); 
    return this.substr(0, index) + character + this.substr(index + character.length); 
} 

alert("abc".replaceAt(1, "B")); // aBc 
alert("abc".replaceAt("1", "B")); //aBc 
+2

Если он не использует '.call' или' .apply', то 'this' будет строкой, в которую был вызван' replaceAt'. –

+0

Или, если вложенная функция вызывается из обратного вызова, «это» не будет указывать на функцию. – mark

+0

Я не знаю, как OP вызывает 'nfu_change()', но похоже, что это проблема, если 'index' является строкой. –

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

  • Нет связанных вопросов^_^