3

forEach またはマップを使用して NodeList を反復処理したいことがよくあります。私の簡略化されたコードは次のように機能します。

var nodeListMap = Array.prototype.map;
var els = document.querySelectorAll('.classname');
nodeListMap.call(els, function(el){...});

これはうまくいきます。ただし、そうする必要はありませんがmap.call、これを行うと...

var nodeListMap = Array.prototype.map.call;
var els = document.querySelectorAll('.classname');
nodeListMap(els, function(el){...});

その後、それは戻ります

TypeError: object is not a function

簡単にできるようにコードを変更するにはどうすればよいnodeListMap(array, fn)ですか?

4

5 に答える 5

3

Array.prototype.map.callコンテキストなしでcall関数 ( )を取得するだけです。関数Function.prototype.callにバインドする必要があります。map

var nodeListMap = Function.prototype.call.bind(Array.prototype.map);

を使用したくない場合はbind、次のように書くこともできます

function nodeListMap(_list /* … */) {
    return Function.prototype.call.apply(Array.prototype.map, arguments);
}
于 2013-02-08T19:26:49.157 に答える