有人能解释一下这种行为吗?我不明白......变量a没有触及。哪里有用?
a === undefined // not touched -> on call variable a got exception (this behavior I understand)
/a/.test(function(){a}) // => true !!?
由于
修改
非常感谢您的回答,但我目前只有一个子问题。
http://ejohn.org/blog/simple-javascript-inheritance/#ig-sh-2
关于这段代码:
fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/
为什么约翰使用这个?而不是简单的
fnTest = /\b_super\b/
如果我理解,/xyz/.test(function(){xyz;})
每次都是正确的,就像
/xyz/.test('function(){xyz;}')
答案 0 :(得分:2)
你在哪里:
a === undefined // not touched -> on call variable a got exception
这是测试 a 的值是否未定义。如果a已声明且未分配值(在此情况下评估其值将返回 undefined ),或者已为其指定值 undefined ,则返回true 。如果 a 尚未声明或以其他方式初始化,则会引发参考错误。
在所有其他情况下,它将返回 false 。
在:
/a/.test(function(){a}) // => true !!?
表达式/a/
是一个正则表达式初始化程序(或literal),它创建一个新的正则表达式,如下所示:
new RegExp('a');
匹配字符串中任何位置的“a”字符。
然后调用正则表达式的test方法,该方法将返回true或false。 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/ : /.*/;
正在做的是根据使用正则表达式 test 方法测试函数对象的结果,为函数对象创建测试。
测试方法的参数应该是一个字符串,因此根据ECMA-262,如果不是,则将其转换为字符串。如果参数是一个对象,那么将调用它的 toString 方法,并且对于通常的函数返回函数体中的代码,但并非总是而不是全部ECMAScript主机。
例如,内置函数很多都会返回:
function pow() {
[native code]
}
所以上面所说的是“如果函数返回函数体,则将以下内容分配给 fnTest :”
new RegExp('\\b_super\\b');
(请注意,这种形式的正则表达式需要双反斜杠),它将匹配一个字符串,其中包含单词“_super”。
如果函数没有返回函数体,它会将 fnTest 设置为:
new RegExp('.*');
将匹配任何包含零个或多个字符的字符串。
答案 1 :(得分:1)
如果您尝试访问未定义的变量(不是对象的属性),您将获得ReferenceError
。
要避免这种情况,请定义您的变量:
var a;
a === undefined; //true
现在第二个例子:
/a/
是正则表达式文字,与new RegExp('a');
相同,因此它与a
变量无关。
至于最后一部分.test(function(){a})
,该函数尚未执行,因此未访问a
变量(未定义),因此没有错误。
此外,它返回true
因为test
函数需要一个字符串而不是一个函数,所以它会将函数隐式转换为它的字符串值。
因此,就像你在做:/a/.test('function () {a}');
答案 2 :(得分:0)
这些行为的原因是:
a === undefined
,它显示变量得到异常,因为a显然没有定义。
/a/.test(funcion(){a})
它返回true,因为/a/
创建正则表达式变量,
test
内,function(){a}
创建一个函数,但尚未调用,因此不会出现异常。但我没有得到返回true
的理由。 = =