6

这很奇怪,不知道为什么会发生,但就是这样。当我这样做时:

/^\d+$/.test('16')

它工作正常。但是当我执行以下操作时,出现错误

var t = /^\d+$/.test;
t('16');

我得到的错误是这样的:

TypeError:在不兼容的接收器 [object Window] 上调用了方法 RegExp.prototype.test

我不知道它与这里的 Window 有什么关系……知道吗?

4

3 回答 3

10

或者,您可以使用bind创建一个使用正则表达式的新函数this

var r = /^\d+$/;
var t = r.test.bind(r)
t(16)
于 2015-02-21T10:48:48.687 回答
9

当您这样做时,/^\d+$/.test('16')您正在test使用您的正则表达式作为this对象调用函数(即作为对象上的方法调用)。

运行时,t(16)您没有指定对象,因此this默认为顶部对象,即window.

要复制第一个行为,您必须这样做:

var r = /^\d+$/;
var t = r.test;
t.call(r, 16);
于 2012-09-21T18:38:00.807 回答
0

当我想通过匹配正则表达式的东西过滤数组时,我看到了这个问题,并使用以下方法修复它bind

var items = ['a', 'b', 'c', 'A'];
var pattern = new RegExp('^a$', 'i');
var matches = items.filter(pattern.test.bind(pattern));
console.log(matches);

结果如下:

['a', 'A']
于 2017-03-15T15:19:40.507 回答