2

谁能解释我这种行为?我不明白...变量 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;}')
4

3 回答 3

2

你在哪里:

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('.*');

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

于 2013-11-05T01:09:30.803 回答
1

如果您尝试访问未定义的变量(不是对象的属性),您将获得一个ReferenceError.

为避免这种情况,请定义您的变量:

var a;

a === undefined; //true

现在至于第二个例子:

/a/是正则表达式字面量,与变量相同,new RegExp('a');因此与变量无关a

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

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

因此,就像您正在做的那样:/a/.test('function () {a}');

于 2013-11-05T01:12:12.810 回答
0

这些行为的原因是:

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

  • /a/.test(funcion(){a})它返回 true,因为/a/创建了一个正则表达式变量

  • 在里面testfunction(){a}创建一个函数,但是它没有被调用,所以它不会有异常。

但我不明白退货的原因true。= =

于 2013-11-05T01:02:16.353 回答