将RegExp.test分配给变量

2 javascript regex functional-programming

以下代码:

var r = /^[0-9A-Z]$/.test;
r("A")
Run Code Online (Sandbox Code Playgroud)

引发'TypeError:无法将undefined转换为object'

我怎样才能将测试函数分配给变量,传递函数,后期评估等?(没有将正则表达式包装在另一个函数中)

更新:

在回答之前考虑一下这段有效的代码:

var o = { f: function() { return 1 } };
var a = o.f;
var b = a();     // b = 1
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 6

它与方法this内部的值有关test.

例如:

var obj = {
  method: function () { return this === obj }
};

obj.method(); // true

var method = obj.method;
method(); // false
Run Code Online (Sandbox Code Playgroud)

如果您将该test方法作为"函数" 调用- 作为您的示例r();- ,该this值将引用undefined(对于ECMAScript 5中的内置函数或严格函数,在上面的示例this中将引用全局对象).

RegExp.prototype使用this不是RegExp对象的值调用任何方法,将始终生成此TypeError异常,引用规范:

15.10.6 RegExp原型对象的属性

在以下对RegExp原型对象属性的函数的描述中,短语"this RegExp object"指的是调用该函数的该值的对象; 如果此值不是[[Class]]内部属性的值不是"RegExp"的对象或对象,则抛出TypeError异常.

但是,您可以使用以下方法将test方法绑定到您的r函数Function.prototype.bind:

var re = /^[0-9A-Z]$/,
    r = re.test.bind(re);

r("A"); // true
Run Code Online (Sandbox Code Playgroud)

或使用call或apply:

var r = re.test;
r.call(re, "A"); // true
Run Code Online (Sandbox Code Playgroud)