奇怪的javascript行为FireFox 5.0



我已经运行javascript很长一段时间了,我在IE或早期版本的firefox中从未遇到过任何问题。但是,在Firefox 5.0中,if会失败。

注意!为了简化示例,已经删除了公式,因为我已经确认该公式正在工作并产生预期的结果。

<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);
}
谁能对这个问题给出一些说明?

它在Firefox上失败是因为全局对象的NaN属性在ECMAScript 5中定义为不可写不可配置不可枚举,而Firefox 4(及以上)正在实现该规范的这个版本。

这意味着该属性的值不能通过赋值-non-writable-来改变,该属性不能被重新配置(不能改变上述三个属性中的任何一个)或被删除-non-configurable-,它不会出现在for-in循环或Object.keys方法-non-enumerable-中。

你可以重命名你的函数,或者更好的是,重构你的代码以便暴露更少的全局标识符来避免这个问题。

全局对象的值属性,如NaN, Infinityundefined,在ECMAScript 3上是可写的,这导致了很多问题,你不能依赖它的值,ES5解决了这个问题。

重命名函数—NaN现在已经成为一个不可配置的属性——所以你只需要给你的函数另一个名字

Error: can't redefine non-configurable property 'NaN'
Source File: formula.html
Line: 2

尝试用不同的名称重新定义NaN方法,如checkNaN。这是一个不可配置的全局属性

最新更新