javascript – inherit.js中的奇怪的正则表达式(由John Resig提供) – 为什么,怎样以及如何?

前端之家收集整理的这篇文章主要介绍了javascript – inherit.js中的奇怪的正则表达式(由John Resig提供) – 为什么,怎样以及如何?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Strange JavaScript idiom – what does “/xyz/.test(function(){xyz;})” do?1个
我最近使用了John Resig的 little utility library,名为 inherit.js.我经常尝试理解我正在使用的库的核心部分,经过大量的讨论后我终于理解了代码的硬件(即他如何调用相应的超类方法).

我没有得到的1%位与正则表达式有关

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

> regex / xyz /针对函数进行测试. MSDNMDN都声明测试采用字符串作为参数.没有提到功能,但由于控制台中没有错误,我想它必须飞,但它是如何工作的?
>下一个WTF是函数体是xyz;.此函数无法执行,因为否则会导致“ReferenceError:xyz未定义”.对?那它是做什么用的?
>如果测试结果为真,则fnTest等于在字边界检查_super的正则表达式,否则匹配任何内容的正则表达式.双WTF;又如何以及为什么.

后来有一段相关的代码,正在使用这个正则表达式.

// Check if we're overwriting an existing function
  prototype[name] = typeof prop[name] == "function" &&
    typeof _super[name] == "function" && fnTest.test(prop[name])
        ? aFunctionThatCanCallSuper /* Lots of code */
        : prop[name];

我在这里想知道的是fnTest.test(prop [name]).我理解所有其他测试,检查属性是否存在,是一个函数等,但不是正则表达式测试的作用.任何人?

解决方法

什么:

test只接受字符串作为输入,因此函数将是toStringed,就像任何其他不是字符串的对象一样. xyz不会被解释为变量,而是作为字符串,因此它不会引发引用错误.这也发生在其他地方,例如:

var a = function(){}; var b = function(){};
console.log(a + b); // `+` coerces with `toString`

原因:

旧浏览器中函数的序列化是不可靠的,并且可能不会在函数体中输出_super属性,但是(我假设)函数{[native code]}或[object Object];在这些情况下,使用正则表达式(如/.*/)来匹配任何内容,而不执行可在输出正确结果的浏览器中完成的优化.

相关链接了解更多信息:

http://blog.buymeasoda.com/understanding-john-resigs-simple-javascript-i/(Andreas发现)
http://es5.github.io/x15.3.html#x15.3.4.2
http://bytes.com/topic/javascript/answers/747203-function-tostring

猜你在找的JavaScript相关文章