0

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

var str = "A string with * and ^ and even $";
var indeces = ["*", "^", "$"].map(str.indexOf); // doesnt work

我宁愿不传递另一个函数来做与方法本身完全相同的事情......

[...].map(function(token) { return str.indexOf(token); }); // works

有没有一种优雅的方式来做到这一点?

4

2 回答 2

1

和...之间的不同

function(token) { return str.indexOf(token); }

str.indexOf

是在第一种情况下你不会有上下文问题。

在第二种情况下,这不会是strbut window。是字符串str.indexOf命名的属性的值。indexOf这是一个函数,但无法从值中知道您从哪个对象中获取它。所以如果你通过str.indexOf了,你只是在传递函数,而不是在传递str

["*", "^", "$"].map(str.indexOf);

相当于

["*", "^", "$"].map(function(token) { return window.indexOf(token); });

如果窗口上有 indexOf 函数。

只是为了更清楚,但不要使用它:一个函数可以绑定到一个对象。如果你这样做

var f = str.indexOf.bind(str); // makes a copy of indexOf, bound to str
["*", "^", "$"].map(f);

然后thisstrf调用的时间。

于 2012-10-14T11:40:50.790 回答
1

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

var str = "A string with * and ^ and even $"
var indeces = ["*", "^", "$"].map( str.indexOf, str);
//                                              ^str is context
//=> indeces = [14, 20, 31]
于 2012-10-14T11:53:07.967 回答