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

@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 に答える
1

の違い

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

str.indexOf

最初のケースではコンテキストの問題が発生しないということです。

str2 番目のケースでは、これはbutではありません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);

thenthisが呼び出されるstrときfです。

于 2012-10-14T11:40:50.790 に答える