Странное поведение javascript FireFox 5.0 - PullRequest
1 голос
/ 09 августа 2011

Я довольно долго работал на javascript, и у меня никогда не возникало проблем с IE или более ранней версией Firefox. В Firefox 5.0, однако, если не удается.

Внимание! Формула была удалена, чтобы упростить пример, так как я подтвердил, что формула работает и дает ожидаемый результат.

<script type="text/javascript">
    function NaN(Num) {
        return (isNaN(Num) || Num == Infinity || Num == -Infinity ? "n/a" : Num);
    }

    function CalculateFormula() {
        result = NaN(*formula*);
    }

</script>

Когда нужно вызвать функцию NaN, javascript просто завершается. В IE он работает как шарм, но для поддержки FireFox 5.0 я удалил из результата функцию NaN.

function CalculateFormula() {
    result = *formula*;
}

Я тоже пробовал это, но он также выйдет из скрипта при вызове функции NaN. Но это подтвердило, что моя формула вернула число, как и ожидалось.

function CalculateFormula() {
    result = *formula*;
    result = NaN(result);
}

Кто-нибудь может пролить свет на эту проблему?

Ответы [ 3 ]

6 голосов
/ 09 августа 2011

В Firefox происходит сбой, потому что NaN свойство глобального объекта определено в ECMAScript 5 как недоступно для записи , не настраивается и не перечисляемый и Firefox 4 (и выше) реализует эту версию спецификации.

Это означает, что значение этого свойства нельзя изменить с помощью присваивания -non-writeable- , свойство не может быть переконфигурировано (не может изменить ни один из трех упомянутых атрибутов) или удалено -non-configurable- , и оно не будет отображаться на for-in цикл или Object.keys метод -non-enumerable- .

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

Свойства значения глобального объекта как NaN, Infinity и undefined, были доступны для записи в ECMAScript 3, и это вызвало многопроблем, вы не могли полагаться на его значения, исправление ES5Это проблема.

3 голосов
/ 09 августа 2011

Переименование функции - NaN теперь стало неконфигурируемым свойством - поэтому вам просто нужно дать вашей функции другое имя

Error: can't redefine non-configurable property 'NaN'
Source File: formula.html
Line: 2
2 голосов
/ 09 августа 2011

Попробуйте переопределить ваш NaN метод с другим именем, например checkNaN. Это не настраиваемое глобальное свойство.

...