奇怪的JavaScript成语 – “/xyz/.test(function(){xyz;})”是做什么的?

约翰Resig写了一个漂亮的类function,时髦。 我试图弄清楚发生了什么事情,除了一行之外,几乎所有的东西都已经算出来了:

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

一些事情马上就会浮现在脑海,第一个xyz从来没有被初始化为variables; 那么为什么这样做呢? 其次,为什么testing/xyz/针对不返回任何内容的东西(不是返回语句)。 除非有一些漂亮的JavaScript属性,我不知道(这是可能的,我觉得自己相当擅长JS,并可以解释我遇到的代码大部分不是,但是,意味着我在同一个Mt John Resig称之为珠穆朗玛峰的大山)

对于那些好奇,这里是从约翰resigs网站约翰Resig简单的JavaScriptinheritance完整的未经编辑的代码:

 (function () { var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; // The base Class implementation (does nothing) this.Class = function(){}; // Create a new Class that inherits from this class Class.extend = function(prop) { var _super = this.prototype; // Instantiate a base class (but only create the instance, // don't run the init constructor) initializing = true; var prototype = new this(); initializing = false; // Copy the properties over onto the new prototype for (var name in prop) { // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn){ return function() { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-class this._super = _super[name]; // The method only need to be bound temporarily, so we // remove it when we're done executing var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } // The dummy class constructor function Class() { // All construction is actually done in the init method if ( !initializing && this.init ) this.init.apply(this, arguments); } // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect Class.constructor = Class; // And make this class extendable Class.extend = arguments.callee; return Class; }; })(); 

这只是一个快速和肮脏的方式来检查“函数反编译”是否工作。

RegExp.prototype.test方法将采用参数,并将其转换为String,函数内部的xyz引用永远不会被评估。

你为什么要检查这个?

由于Function.prototype.toString方法返回Function.prototype.toString实现相关表示,在某些实现中,这些较旧的Safari版本,Mobile Opera和一些Blackberry浏览器,它们实际上并没有返回任何有用的东西。