わかりました、私はそれを少しずつ説明しようとしています:
Function.prototype.partial = function() {
var fn = this, args = Array.prototype.slice.call(arguments);
return function() {
var arg = 0;
for (var i = 0; i < args.length && arg < arguments.length; i++) {
if (args[i] === undefined) {
args[i] = arguments[arg++]; //This line is where the confusion is
}
}
return fn.apply(this, args);
};
};
最初の行:
var fn = this, args = Array.prototype.slice.call(arguments);
これは、 の値this
と の値をarguments
2 つの変数に格納します。これは、両方の値が次の関数ブロックでオーバーライドされるためです。
return function() {
//inside here arguments will be whatever is passed to this returned function later.
};
for ループ:
var arg = 0;
for (var i = 0; i < args.length && arg < arguments.length; i++) {
}
partial
基本的に、関数に渡されたすべての引数をループし、 if より早く終了しますarg >= arguments.length
。
if (args[i] === undefined) {
args[i] = arguments[arg++]; //This line is where the confusion is
}
したがって、args
配列の引数が定義されていない場合は、配列内の次の引数に置き換えますarguments
。すべての引数が置き換えられると、元の関数がマージされた引数配列で呼び出されます。
return fn.apply(this, args);
これが実際にどのように機能するかを次に示します。
function xy(arg1, arg2) {
console.log(arg1 + " / " + arg2);
}
var p1 = xy.partial("foo", undefined);
p1("bar") //"foo / bar"
var p2 = xy.partial(undefined, "bar");
p2("foo") //"foo / bar"
var p3 = xy.partial("foo");
p3("bar") //"foo / undefined" --> because you have to activly pass "undefined" otherwise the arguments array is too short
最後になりましたが、このコードが例でどのように機能するかを詳しく説明しますp1 = xy.partial("foo", undefined);
。
//lets call xy.partial("foo", undefined);
Function.prototype.partial = function() {
//fn = xy
//args = ["foo", undefined]
var fn = this, args = Array.prototype.slice.call(arguments);
//return function that is assigned to p1
//lets call p1("bar")
return function() {
//arguments = ["bar"]
var arg = 0;
//for (var i = 0; i < 2 && arg < 1; i++)
for (var i = 0; i < args.length && arg < arguments.length; i++) {
//first iteration:
//args[0] === "foo" -> nothing happend
//second iteration:
//args[1] === undefined -> args[1] = arguments[0] (= "bar"); arg++;
if (args[i] === undefined) {
args[i] = arguments[arg++]; //This line is where the confusion is
}
}
//at this point: args = ["foo", "bar"];
//now just call the function with the merged array
return fn.apply(this, args);
};
};