Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome V8 Bug?第二次调用后,函数的作用不同_Javascript_Google Chrome_Ubuntu 10.04_V8_Chromium - Fatal编程技术网

Javascript Chrome V8 Bug?第二次调用后,函数的作用不同

Javascript Chrome V8 Bug?第二次调用后,函数的作用不同,javascript,google-chrome,ubuntu-10.04,v8,chromium,Javascript,Google Chrome,Ubuntu 10.04,V8,Chromium,请看一下下面的JavaScript。我从中提取了一些东西,所以你可以关注问题的本质 您会注意到,我连续两次调用prepPath函数,传入完全相同的字符串。在firefox和IE8中,此函数每次都会提醒true(如预期的那样)。但是,在Chromium 5.0.375.127(55887)Ubuntu 10.04中,函数第一次返回true,第二次调用返回false,尽管输入保持完全相同 <script type="text/javascript"> function prep

请看一下下面的JavaScript。我从中提取了一些东西,所以你可以关注问题的本质

您会注意到,我连续两次调用prepPath函数,传入完全相同的字符串。在firefox和IE8中,此函数每次都会提醒true(如预期的那样)。但是,在Chromium 5.0.375.127(55887)Ubuntu 10.04中,函数第一次返回true,第二次调用返回false,尽管输入保持完全相同

<script type="text/javascript"> 
    function prepPath(str)
    {   
        var regX = /[^\s/"'\\].*[^\s/"'\\]/g;
        if(regX.test(str))
        {
            alert("true: " + str);
        }
        else
        {
            alert("false; " + str);
        }
    }

    prepPath("/desktop"); // alerts: true
    prepPath("/desktop"); // alerts: false 
</script> 

函数路径(str)
{   
var regX=/[^\s/“'\\].[^\s/“'\\]/g;
if(注册测试(str))
{
警报(“真:+str”);
}
其他的
{
警告(“错误;”+str);
}
}
预路径(“/桌面”);//警报:正确
预路径(“/桌面”);//警报:错误

为什么在Chromium中第二次返回false?

规范中对文本正则表达式何时应该重置存在一些模糊性(回想一下,它们有状态)。您可以通过执行以下操作来解决此问题:

var regX = new RegExp(/[^\s/"'\\].*[^\s/"'\\]/g);
实例:

或者这个:

var regX = /[^\s/"'\\].*[^\s/"'\\]/g;
regX.lastIndex = 0;
实例:


我从那些比我更深入研究过它的人那里得知,它实际上不是一个完全的bug,而是一个模棱两可的问题。不仅仅是Chrome浏览器,其他浏览器的一些版本也有类似的问题。

这很有效;非常感谢。但这并不寻常。通常,当您在设置变量(函数中)的值之前使用“var”时,该变量无论如何都是一个新变量,并且只在调用之间保持零状态的函数级作用域。@LonnieBest:哦,这很不寻常,好吧,它看起来肯定是错的,不是吗?这与文字以及它们被实例化的时间有关,确实有一个论点认为文字被实例化一次,然后被重用,尽管看起来很奇怪。这是我所知道的唯一一个这种奇怪行为的例子,如果这是一种安慰的话。:-)实际上,规范需要以下行为:。它有一个Chromium bug:。如果我想让RegEx对象保持状态,我会在函数外部声明它。我认为Chromium v8团队应该在这一点上与firefox和IE保持一致,尽管规范模棱两可。@LonnieBest:在这两个方面都同意。因为这在第5版规范定稿之前就已经知道了,我有点希望新规范能澄清这一点,但我还没有深入到这一点。在正则表达式中需要“g”标志的唯一时间是,如果你想多次使用同一个表达式,在不同的使用之间标记lastIndex。如果没有“g”标志,您的代码将按照预期的方式工作。如果在定义regX.lastIndex后将其设置为0,它也将返回预期值。