为什么我不能执行以下操作?
var str = "A string with * and ^ and even $";
var indeces = ["*", "^", "$"].map(str.indexOf); // doesnt work
我宁愿不传递另一个函数来做与方法本身完全相同的事情......
[...].map(function(token) { return str.indexOf(token); }); // works
有没有一种优雅的方式来做到这一点?
为什么我不能执行以下操作?
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
是在第一种情况下你不会有上下文问题。
在第二种情况下,这不会是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);
然后this是str被f调用的时间。
由于@dystroy已经解释的原因,您不能这样做。但是,您可以使用map上下文,这将给出所需的结果:
var str = "A string with * and ^ and even $"
var indeces = ["*", "^", "$"].map( str.indexOf, str);
// ^str is context
//=> indeces = [14, 20, 31]