よし、置換によってこの問題に取り組みましょう。まず始めに:
Function.prototype.call.apply(Array.prototype.slice, arguments);
私たちが知っていること:
Function.prototype.call関数です。
- の
thisポインターは をcall指しFunction.prototypeます。
- のポインターをに
apply変更するために使用します。thiscallArray.prototype.slice
argumentsに適用されます (パラメータとして渡されません) call。
したがって、上記のステートメントは次と同等です。
Array.prototype.slice.call(arguments[0], arguments[1], ...);
このことから、次のことがわかります。
Array.prototype.slice関数です。
- の
thisポインターは をslice指しArray.prototypeます。
- のポインターをに
call変更するために使用します。thisslicearguments[0]
arguments[1], ...にパラメータとして渡されますslice。
これは次と同じです。
arguments[0].slice(arguments[1], ...);
これの利点は、1 行で高速なバインドされていないラッパーを作成できることです。slice
編集:バインドされていない高速ラッパーを作成するより良い方法は次のとおりです (一部の古いブラウザーでは機能しない可能性があることに注意してください。ただし、今はそれについて心配する必要はありません。サポートbind):
var slice = Function.prototype.call.bind(Array.prototype.slice);
これは次と同じです。
function slice() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
使い方:
Function.prototype.call関数です。
- の
thisポインターは をcall指しFunction.prototypeます。
- のポインターをに
bind変更するために使用します。thiscallArray.prototype.slice
bindargumentsに適用される関数を返しますcall。
おまけ:あなたのプログラミング スタイルが私のように非常に機能的である場合、コードの一部が非常に便利であることがわかります。
var funct = Function.prototype;
var obj = Object.prototype;
var arr = Array.prototype;
var bind = funct.bind;
var unbind = bind.bind(bind);
var call = unbind(funct.call);
var apply = unbind(funct.apply);
var classOf = call(obj.toString);
var ownPropertyOf = call(obj.hasOwnProperty);
var concatenate = call(arr.concat);
var arrayFrom = call(arr.slice);
callこれを使用すると、またはを使用してバインドされていないラッパーを簡単に作成できますapply。
classOf値の内部を取得するために使用でき[[Class]]ます。
ownPropertyOf内部 for in ループを使用できます。
concatenate配列を結合するために使用できます。
arrayFrom配列の作成に使用できます。