为什么我不能在javascript中传递str.indexof来映射



为什么我不能执行以下操作?

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而是windowstr.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在调用fstr

由于@dystroy已经解释过的原因,你不能这样做。但是,您可以使用上下文map,这将给出所需的结果:

var str = "A string with * and ^ and even $"
var indeces = ["*", "^", "$"].map( str.indexOf, str);
//                                              ^str is context
//=> indeces = [14, 20, 31]

最新更新