【问题标题】:Strange JavaScript idiom - what does "/xyz/.test(function(){xyz;})" do?奇怪的 JavaScript 习语 - “/xyz/.test(function(){xyz;})” 是做什么的?
【发布时间】:2010-10-12 04:27:35
【问题描述】:

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

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

有几件事立即浮现在脑海中,首先xyz 从未被初始化为变量;那么为什么这行得通呢?其次,为什么要针对没有返回任何内容的东西(没有返回语句)测试/xyz/。除非有一些我不知道的 javascript 的漂亮属性(这是可能的,我认为自己非常擅长 JS,并且可以解释我遇到的大多数代码,但这并不意味着我在同一个山上. 珠穆朗玛峰大小的山,约翰·雷西格称之为家)。

对于那些好奇的人,这里是来自 john resigs 网站 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;
  };

})();

【问题讨论】:

  • .. 读者(在)健全性检查? :)
  • .. 嗯,我将代码包围在 ... 标记中,想知道为什么它会如此糟糕(注意 > .. < 不要评估我的想法他们应该哦,今天不是我的日子。

标签: javascript regex function


【解决方案1】:

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

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

你为什么要检查这个?

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

【讨论】:

  • 那么,xyz 匿名函数体不是没有必要的吗?
  • @mykhal, xyz 是您真正要寻找的,要知道 函数反编译 可以正常工作。它只是检查转换为字符串的函数是否生成包含函数主体的字符串...
  • @CMS 是的,我终于在一段时间后得到它..)
  • 只是添加一个注释:为了使测试通过 jslint,它必须是 /var xyz/.test(function () { var xyz; }) ? /\b_super\b/ : /[\D|\d]*/;为什么 \D|\d 简单,一个捕获所有数字,另一个捕获其他所有数字,它等效于 .* 但这被认为是“不安全的”,因为您没有定义限制。让我永远意识到他们所说的不安全的“。”是什么意思。投票给你,也标记为答案,非常感谢CMS。
  • @trinithis,好吧,typeof foo == 'function 会起作用,但问题是你最终会包装每个函数对象,即使它们不使用_super。 Resig 只是检查每个函数,看看它是否在其主体中使用了_super 标识符。如果_super 出现在函数的主体上,那么他将其包装到另一个函数中,在其中他首先通过分配this._super 公开“类”的“超级”。然后他执行原来被检查的函数,被证明使用_super,最后他恢复了this._super的值...
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2023-04-10
  • 2019-09-09
  • 1970-01-01
相关资源
最近更新 更多