分配RegExp.测试一个变量
Assigning RegExp.test to a variable
以下代码:
var r = /^[0-9A-Z]$/.test;
r("A")
抛出" TypeError: can't convert undefined to object "
我怎么能把测试函数分配给一个变量,用于传递函数,以后的评估等?(不将正则表达式包装在另一个函数中)
更新:在回答之前考虑一下这段有效的代码:
var o = { f: function() { return 1 } };
var a = o.f;
var b = a(); // b = 1
这与test
方法中this
的值有关。
var obj = {
method: function () { return this === obj }
};
obj.method(); // true
var method = obj.method;
method(); // false
如果你调用test
方法"作为一个函数"——就像你的例子r();
一样,this
的值将指向undefined
(对于ECMAScript 5中的内置函数或严格函数,在上面的例子中this
将指向全局对象)。
调用RegExp.prototype
的任何方法,其this
值不是RegExp
对象,将始终生成此TypeError
异常,引用规范:
15.10.6 RegExp原型对象的属性
在下面的函数描述中,作为RegExp原型对象的属性,短语"这个RegExp对象"指的是函数调用的this值的对象;如果this值不是对象,或者[[Class]]内部属性的值不是"RegExp",则抛出TypeError异常。
但是,您可以使用Function.prototype.bind
方法将test
方法绑定到r
函数:
var re = /^[0-9A-Z]$/,
r = re.test.bind(re);
r("A"); // true
或使用call
或apply
:
var r = re.test;
r.call(re, "A"); // true
由于我在所有评论中基本上都试图回答这个问题,所以让我们总结一下到目前为止所涉及的所有内容。
当你这样做的时候:
var r = /^[0-9A-Z]$/.test;
您正在将RegExp
对象中的名为test
的方法分配给名为r
的变量。它只是一个方法赋值。与您创建的特定正则表达式对象没有任何连接。如果事实,r == RegExp.prototype.test
.
当你尝试这行代码时:
r("A")
你试图执行RegExp.prototype.test
并传递"A"
,但是你没有合适的对象上下文。当测试函数运行时,this
指针不会指向正则表达式对象,它将指向全局对象(在浏览器中是window
对象)。
在你的o, a和b代码的例子,它的工作,因为你所做的是调用函数引用没有实例数据和this指针是不使用的(因此,它不设置为适当的对象上下文无关紧要)。正则表达式方法不是这种情况。它需要它的实例数据(例如,它的this
指针指向一个真正的正则表达式对象)。
可以采用方法点并添加适当的this
指针,尽管我不知道为什么这在这个特定示例中有用。例如,您可以这样做:
var re = /^[0-9A-Z]$/;
var r = re.test;
r.call(re);
将this
指针设置为正则表达式对象,然后使用该this
指针执行r
方法。
我真的不知道你为什么要这样做,但希望这有助于解释事情。
主要编辑:现在我已经看到了你的更新,它消除了我原来的帖子谈到的问题,我意识到问题是test
函数在运行时需要与对象相关联。regex对象后的标准点符号会自动将test
中的this
设置为等于该对象。当您单独调用它作为r("A");
时,this
将被设置为窗口对象,这不起作用并给出一个错误。(这对某些函数来说并不重要,但是test
需要它的this
对象是一个要操作的正则表达式。)
您可以通过使用.call()
:
this
来使其工作var re = /^[0-9A-Z]$/;
var rf = re.test;
alert(rf.call(re,"A")); // displays 'true'
alert(rf.call(/blah/,"A")); // displays 'false'
但是这看起来很傻。我想问你为什么不能这样做:
var r = /^[0-9A-Z]$/;
r.test("A");
r.test("B");
这允许您保留一个正则表达式的副本,并且您不需要自己的函数包装器。如果您确实需要r("A")
语法,只需添加一个包装器。
- 导航到特定事件的另一个变量页面
- 我可以在Javascript/jQuery中使用一个变量作为键吗
- 使用mongodb更新中的一个变量
- 将节点数据分配给另一个变量jstree
- Javascript:在激发函数后返回一个变量以供使用
- 替换另一个变量对象中的变量值
- 什么'它的意思是当一个变量位于括号外时
- 可以't将sessionStorage设置为Javascript中的一个变量
- 在Flickr API的标签参数中传递一个变量
- 从Jquery函数中获取一个变量
- 为两个ID设置一个变量的正确语法
- 如何将变量值附加到另一个变量
- 通过加载函数发送一个变量
- 如何将一个变量从一个控制器传递到合金中的另一个控制器
- 如何在Jquery函数中为自动完成文本区域指定一个变量作为Id
- Javascript未在其中一个变量上输出0
- 保留“;这个“;在一个变量中;这个“;使用此变量
- 是否可以在另一个变量中使用未声明的变量
- JS/ANGULAR使用一个变量's值作为另一个对象的键
- 如何每秒从一个变量中提取一定次数的javascript/html