Javascript regexp测试行为与函数

Javascript regexp测试行为与函数,javascript,regex,Javascript,Regex,有人能解释我的这种行为吗?我不明白。。。变量a未被触及。哪里有用 a === undefined // not touched -> on call variable a got exception (this behavior I understand) /a/.test(function(){a}) // => true !!? 谢谢 编辑: 非常感谢您的回答,但我现在有一个子问题 关于这段代码: fnTest = /xyz/.test(function(){xyz;}) ?

有人能解释我的这种行为吗?我不明白。。。变量a未被触及。哪里有用

a === undefined // not touched -> on call variable a got exception (this behavior I understand)
/a/.test(function(){a}) // => true !!?
谢谢

编辑:

非常感谢您的回答,但我现在有一个子问题

关于这段代码:

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/
约翰为什么要用这个,而不是简单的

fnTest = /\b_super\b/ 
如果我理解正确,
/xyz/.test(function(){xyz;})
每次都是真的,就像

/xyz/.test('function(){xyz;}')

这些行为的原因是:

  • a===undefined
    ,它显示变量a get异常,因为a显然没有定义

  • /a/.test(function(){a})
    它返回true,因为
    /a/
    创建一个regexp变量

  • test
    内部,
    function(){a}
    创建了一个函数,但是它没有被调用,所以不会出现异常
但是我不知道返回的原因
true
==

您有:

a === undefined // not touched -> on call variable a got exception
这是在测试a的值是否未定义。如果已声明且未分配值(在这种情况下,其值将返回undefined),或已分配值undefined,则返回true。如果未声明或以其他方式初始化,它将抛出引用错误

在所有其他情况下,它将返回false

在:

表达式
/a/
是一个正则表达式初始化器(or),它创建一个新的正则表达式,就像通过:

new RegExp('a');
它匹配字符串中任意位置的“a”字符

然后调用正则表达式的方法,该方法将返回true或false。要测试的参数应该是字符串,因此如果不是字符串,则将其类型转换为字符串。它将返回一个表示函数的字符串(本质上是函数的实际代码)。因此,你实际上有:

var re = new RegExp('a');
var s = 'function(){a}';
re.test(s);
这将返回true(因为字符串中有一个“a”)

编辑 你似乎在问与此相关的问题:

var initializing = false,
          fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
它所做的是基于使用正则表达式测试方法测试函数对象的结果为函数对象创建测试

测试方法的参数应该是字符串,因此根据ECMA-262,如果不是,则将其转换为字符串。如果参数是一个对象,那么将调用它的toString方法,对于通常返回函数体中的代码,但不总是返回,也不在所有ECMAScript主机中返回

例如,许多内置函数返回如下内容:

function pow() {
  [native code]
}
因此,上面所说的是“如果函数返回函数体,请将以下内容分配给fnTest:”

(请注意,这种形式的正则表达式需要双反斜杠),它将匹配字符串中的单词“_super”

如果函数未返回函数体,则将fnTest设置为:


它将匹配任何具有零个或多个字符的字符串。

如果您试图访问未定义的变量(而不是对象的属性),则会出现
引用错误

要避免这种情况,请定义变量:

var a;

a === undefined; //true
现在来看第二个例子:

/a/
是一个正则表达式文本,与
newregexp('a')相同
因此它与
变量无关

至于最后一部分,
.test(function(){a})
,函数尚未执行,因此未访问
a
变量(未定义),因此没有错误

此外,它返回
true
,因为
test
函数需要字符串,而不是函数,因此它将函数隐式转换为其字符串值


因此,这就像您在做:
/a/.test('function(){a}')

test()
方法对字符串有效。在我看来,它正在将函数转换为字符串,并最终执行
/a/.test('function(){a}')
,从而生成
true
。现在第一行只是一个表达,对我来说没有意义,因为它应该没有任何效果。这段代码是从哪里得到的?@acdcjunior它会抛出一个错误,因为OP可能没有声明或初始化
a
@acdcjunior 6-lineWhile应该返回“函数的依赖于实现的表示”,而不是所有主机都会返回。这不是一个特别好的代码(它不会在严格模式下运行,但可以修复)。如果测试显示了其中一个主机,那么匹配只针对任何角色。啊,所以它支持旧浏览器。好啊谢谢@RobG:)执行函数没有任何区别,因为没有赋值给,所以它不会被创建为全局变量。@RobG这不是我的观点,如果函数执行,它会抛出一个
ReferenceError
<代码>(函数(){a})()//参考错误:未定义a
new RegExp('\\b_super\\b');
new RegExp('.*');
var a;

a === undefined; //true