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

时间:2010-10-12 04:27:36

标签: javascript regex function

John Resig写了一个漂亮的Class函数,时髦。我正在试图弄清楚发生了什么,并且除了一行之外,几乎所有事情都已经解决了:

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

有些事情会立即浮现在脑海中,首先xyz永远不会被初始化为变量;那么为什么这样呢?其次,为什么测试/xyz/反对没有返回任何东西的东西(没有返回语句)。除非有javascript的一些漂亮的属性,我不知道(这是可能的,我觉得自己相当擅长JS并且可以解释大多数我遇到的代码不会,但是,这意味着我在同一个山上的前夕.John Resig称之为珠穆朗玛峰大小的山。)

对于那些好奇的人,这里是来自john resigs site John Resig Simple Javascript Inheritance的完整未经编辑的代码:

(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;
  };

})();

1 个答案:

答案 0 :(得分:50)

这只是一个快速的&检查“函数反编译”是否有效的脏方法。

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

你为什么要检查这个?

因为Function.prototype.toString方法返回函数的依赖于实现的表示,并且在某些实现中,如旧的Safari版本,Mobile Opera和一些Blackberry浏览器,它们不会实际上返回任何有用的东西。