这不起作用:
var s = '^foo';
console.log(['boot', 'foot'].some(s.match));
Uncaught TypeError: String.prototype.match called on null or undefined
但这样做:
var s = '^foo';
console.log(['boot', 'foot'].some(function(i) { return i.match(s) }));
这是为什么?我想象String.prototype.match
函数太过"原始"什么的,但为什么呢?由于我没有使用ES2015,第二个版本看起来相当冗长。还有其他选择吗?
修改
当我写上面的内容时,实际上我的实际需要与实际需要相比,它实际上需要将一个字符串与一些正则表达式相匹配。但是由于下面的答案和评论很好,我明白了:[/^foo/, /^boo/].some(''.match, 'boot')
。
答案 0 :(得分:6)
注意: this
的值取决于函数如何调用! (例外:绑定和箭头功能)
如果您将s.match
传递给.some
,则会调用该函数,并将this
设置为全局对象(例如window
)而不是字符串&#34} ;属于"到。
即。它等同于:
String.prototype.match.call(window, 'foo')
这不起作用,因为this
必须引用字符串对象。
您可以通过将函数绑定到特定的this
值来解决此问题:
['boot', 'foot'].some(s.match.bind(s));
详细了解this
:
答案 1 :(得分:4)
Javascript中的函数值不会带来它的对象。 s.match
的值是一个普通函数值,不知道您碰巧发现它附加到s
。事实上,无论你通过什么字符串访问它,它始终是相同的函数值:
"foo".match === "bar".match
//= true
当您通过对象调用函数时,Javascript会在函数调用期间将this
设置为该对象。但是只要在检索函数值和调用它之间发生任何事情,就会丢失任何对象关联。
您可以使用this
创建一个 记住特定bind
值的功能,就像@Felix King的回答一样。 someFunction.bind(someObject)
与function(arg1, arg2,...) { return someObject.someFunction(arg1, arg2,...); }
具有大致相同的含义,但它会自动正确处理参数数量。