为什么可以';在javascript中将str.indexOf传递给map

为什么可以';在javascript中将str.indexOf传递给map,javascript,Javascript,为什么我不能做以下事情 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)

为什么我不能做以下事情

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
,而是
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);

当调用
f
时,
this
就是
str

由于前面已经解释过的原因,您不能这样做。但是,您可以使用上下文使用
map
,这将得到所需的结果:

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

但我不明白!它们都接受相同的值。如果传递给map,它们的行为不应该类似吗?区别在于接收器,
this
<代码>映射使用receiver
窗口调用函数
(默认上下文)。请尝试理解。所以indexOf方法不属于
str
?这是简单的旧js btw,不是jqueryYes,这个函数(对所有字符串来说都是相同的,但这不是真正的核心问题)只是一个函数,不是绑定到对象的函数,
这个
不是你找到函数的对象。啊,所以我传递了一个对prototype方法的引用,但是它无法知道我想调用哪个string对象。这是有道理的,谢谢!只是一个通知:地图不适用于IE8。
var str = "A string with * and ^ and even $"
var indeces = ["*", "^", "$"].map( str.indexOf, str);
//                                              ^str is context
//=> indeces = [14, 20, 31]