2013-03-15 3 views
1

Я изучаю ошибку в некотором программном обеспечении, которое использует встроенную Javascript-библиотеку. Ошибка, что я имею дело с на следующей строке появляется:Загадочная строка Javascript code

GetVal1("dispLetter")(GetVal1("dispLetter").selectedIndex).value + '~' + (bFinal == true ? '1' : '0'); 

Я изначально не был уверен, что если эта линия была даже действительно, однако, по словам источника управления эта линия была вокруг, так как этот файл был создан в то время как ошибка относительно недавняя. Когда я отлаживался, я обнаружил, что эта строка выдает сообщение об ошибке GetVal1(...) is not a function. Я проверил, чтобы подтвердить, что файл Javascript с определением функции входит заголовок выглядит следующим образом:

function GetVal1(strHTMLId) 

Так что, я думаю, мой вопрос, эта линия действует Javascript код? Есть ли что-нибудь, что вы можете сказать, что может быть ошибка? Спасибо.

+5

Чтобы использовать этот метод, 'GetVal1' должен * вернуть * определение функции. Это так? –

+0

@ExplosionPills Только что проверили, вернув «HTMLSelectElement». Это проблема? –

+0

Мне кажется, что кто-то копировал фрагмент 'GetVal1 (« dispLetter »)' слишком часто. Что должна делать линия? – Bergi

ответ

2
GetVal1("dispLetter")(GetVal1("dispLetter").selectedIndex).value + ... 

выполняет следующие действия:

  • вызовов GetVal1 с аргументом "dispLetter".
  • звонки GetVal1 с аргументом "dispLetter", снова.
  • извлекает свойство selectedIndex возвращаемого значения второго вызова GetVal1
  • Вызывает возвращаемое значение первого вызова GetVal1, с одним аргументом, значение selectedIndex. Это не подходит вашему делу и жалуется на то, что значение не может быть вызвано.
  • Возвращаемое значение value свойство разыменовывается. Далее следует конкатенация строк.

Другими словами, этот код, кажется, предполагает, что первый вызов GetVal1("dispLetter") возвращает функцию (что необычно), а второй вызов возвращает объект со свойством selectedIndex (который является необычным, учитывая первый вызов возвращает функцию).

Некоторые идеи:

  • Если раньше было new ключевое слово перед строкой. Тогда первым вызовом будет вызов конструктора. Неожиданно, что вызов конструктора возвращает функцию, тогда как вызов неконструктора не будет.

  • Если в предыдущей строке (или сейчас) использовался период ожидания, то GetVal1 ссылается (или ссылается на него) на свойство какого-либо объекта. Я чувствую нарушение соглашений об именах, хотя, если GetVal1 предназначен как свойство объекта.

  • Глобальный GetVal1 (или недавно прекратил быть) затенен функцией с тем же именем. Еще раз, я чувствую нарушение правил именования.

  • Скорее всего, GetVal1 сам изменился. Verify GetVal1 может возвращать функцию при задании этой строки в качестве первого аргумента.

  • Возможно состояние привязывается к функции GetVal1 изменилось (например, еще один дополнительный вызов где-то перед кодом. Это, скорее всего, ошибка проектирования, хотя, если эта функция возвращает другой тип объекта при каждом вызове с теми же аргументами. но опять же, скорее всего, является ошибка проектирования или именования нарушение где-то в коде.

  • Другим возможным объяснением является то, что эта линия была там с самого начала, но он никогда не был достигнут ранее. В этом случае это могло быть неправильным все время.

+1

Я бы выбрал последнюю причину :-) – Bergi

+0

@Bergi действительно :-) –

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