9

このスクリプトを別の場所で見ましたが、すべてのチェックボックスをチェックします。

[].forEach.call(document.querySelectorAll('input[type="checkbox"]'),function(el){
       el.checked=true;
    }
);​

私は使い方を知っていますforEach

[0,1,2].forEach(function(num){
    console.log(num);
});

//0
//1
//2

しかし、今は[].forEachで、中には何もありません。では、なぜそれはまだ機能しているのでしょうか。代わりにこれができないのはなぜですか?

document.querySelectorAll('input[type="checkbox"]').forEach(function(el){
       el.checked=true;
    }
);​
4

3 に答える 3

10

JavaScript には第一級の機能があります。つまり、それらはオブジェクトのように扱われ、独自のプロパティとメソッドを持つことができます。組み込みFunction.callメソッドは、this最初の引数として関数のパラメーターを取り、残りの引数は関数自体に渡されます。配列[]は、(あまり簡潔ではないため、あまり使用されない)Array.prototype.forEachメソッドにアクセスする手段として以外は使用されません。

これは基本的にArray.forEach、配列ではないもの (この場合はNodeList. NodeLists がメソッドを提供する場合forEach、それは次と同等であり、次のように読むことができます。

document.querySelectorAll('input[type="checkbox"]').forEach(function(el) {
   el.checked = true;
});​

ということで、もう少し詳しく。call別のコンテキストで関数を実行します。forEachコンテキストを反復処理し、引数として渡された関数を呼び出します。したがって、 aは、 likesomeFunc.call(thisArg, otherArg)のコンテキストにあるかのように実行されます。最も簡単な例を次に示します。thisArgthisArg.someFunc(otherArg)

function callMe(something) {
    return something + this;
}

callMe('Hello'); // Hellonull or Hello[object Window] or something
callMe.call({}, 'World'); // World[object Object]

apply()同じように動作しますが、2 番目の引数として引数の配列を渡します。

于 2012-06-07T01:00:58.063 に答える
4

これは関数[]を取得するために使用していforEachます。関数を取得すると、 を使用.callして、 のメソッドであるかのように呼び出しますdocument.querySelectorAll('input[type="checkbox"]')

document.querySelectorAllの結果は ではなく のArrayように動作するため、これは便利です。そのため、標準のArrayメソッドを再利用できます。

を使用する.callと、最初の引数がthis値として使用されます。thisつまり、この特定のスニペットでは、 のソース内で が検出されるたびにforEach、 に設定されdocument.querySelectorAll('input[type="checkbox"]')ます。

オブジェクトを返さ、メソッドがないため、document.querySelectorAll('input[type="checkbox"]').forEach(...直接呼び出すことはできません。全体は、実際に返されるのメソッドであるのように呼び出すことで、これを回避する方法にすぎません。querySelectorAllArrayforEach.callforEach NodeList

于 2012-06-07T01:01:24.600 に答える
3

に注意して.callください。tothisの結果を適用 (に設定) するため、ドットの左側の (空の) 配列ではなく、これらの結果を反復処理します。document.querySelectorAllforEach

于 2012-06-07T00:59:45.230 に答える