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)
它与方法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异常,引用规范:
在以下对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)