你在哪里:
a === undefined // not touched -> on call variable a got exception
这是测试a的值是否为undefined。如果 a 已被声明但未分配值(在这种情况下评估其值将返回undefined),或者已分配值undefined ,它将返回 true 。如果a没有被声明或以其他方式初始化,它将抛出一个引用错误。
在所有其他情况下,它将返回false。
在:
/a/.test(function(){a}) // => true !!?
该表达式/a/
是一个正则表达式初始化器(或文字),它创建一个新的正则表达式,就像通过:
new RegExp('a');
匹配字符串中任意位置的“a”字符。
然后调用正则表达式的测试方法,它将返回真或假。test的参数应该是一个字符串,因此如果不是,则将其类型转换为字符串。这将返回一个表示函数的字符串(本质上是函数的实际代码)。所以你实际上有:
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:”
new RegExp('\\b_super\\b');
(请注意,这种形式的正则表达式需要双反斜杠)它将匹配其中包含单词“_super”的字符串。
如果函数不返回函数体,它会将 fnTest设置为:
new RegExp('.*');
这将匹配具有零个或多个字符的任何字符串。