_.extend(), _.extendOwn(), _.defaults() から呼ばれる内部関数。 createAssigner()からは部分適用した関数が返ってくる。
■内部構造
// _.defaults = createAssigner(_.allKeys, true);
var createAssigner = function(keysFunc, undefinedOnly) {
// createAssignerから返される部分適用した関数。
return function(obj) {
// 返される関数の引数の長さ。
var length = arguments.length;
// 引数の長さが2未満か引数が null だった場合。
if (length < 2 || obj == null) return obj;
// 返される関数の引数が2つ以上の時の処理。
for (var index = 1; index < length; index++) {
// 第2引数から
var source = arguments[index],
// keysFunc は _.keys() か _.allKeys() どちらか。
// 第2引数以降の引数のkey値の配列作成。
keys = keysFunc(source),
l = keys.length;
// 第2引数「Object」のkey値とその値を第1引数「Object」にコピーするループ。
for (var i = 0; i < l; i++) {
var key = keys[i];
// _.defaults = createAssigner(_.allKeys, true);、_.extend(),_.extendOwn() はこのif文は必ず実行される。
if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
}
}
// コピーされた第1引数を返す。
return obj;
};
};