为什么我不能执行以下操作?
var str = "A string with * and ^ and even $";
var indeces = ["*", "^", "$"].map(str.indexOf); // doesnt work
我宁愿不传入另一个函数来做与方法本身完全相同的事情......
[...].map(function(token) { return str.indexOf(token); }); // works
有没有一种优雅的方法可以做到这一点?
两者之间的区别
function(token) { return str.indexOf(token); }
和
str.indexOf
是在第一种情况下您不会遇到上下文问题。
在第二种情况下,这不是str
而是window
。 str.indexOf
是名为字符串indexOf
的属性的值。这是一个函数,但无法从值中知道您从哪个对象中获取它。所以如果你传递str.indexOf
,你只是传递函数,而不是str
。
["*", "^", "$"].map(str.indexOf);
将等同于
["*", "^", "$"].map(function(token) { return window.indexOf(token); });
如果窗口上有索引函数。
只是为了尝试更清晰,但不使用它:函数可以绑定到对象。如果你这样做
var f = str.indexOf.bind(str); // makes a copy of indexOf, bound to str
["*", "^", "$"].map(f);
然后this
在调用f
时str
。
由于@dystroy已经解释过的原因,你不能这样做。但是,您可以使用上下文map
,这将给出所需的结果:
var str = "A string with * and ^ and even $"
var indeces = ["*", "^", "$"].map( str.indexOf, str);
// ^str is context
//=> indeces = [14, 20, 31]