Необходимо ли реализовать метод createAssigner в underscore.js, используя только замыкание, хотя мы можем реализовать его без замыкания ?.Смотрите Case2 ниже, чтобы найти реализацию метода " createAssigner " без использования замыкания.
У меня есть три объекта с именами John, Jane и Jim.Я пытаюсь расширить объект Джона с Джейн и Джимом.И я могу использовать для этой цели метод "_. Extension" , предоставленный underscore.js.Но реализация этого метода использует концепцию замыкания для достижения функциональности.Есть ли какая-то конкретная причина для использования здесь замыкания, хотя мы можем достичь его (расширить объект с помощью других объектов), не используя концепцию замыкания, как я объяснил в Case2.
Примечание. Случай 2 отсутствует в Underscore.js, но я написал его здесь для ясной передачи информации.
Случай 1: код для расширения объекта john с помощью jane и jim с использованием замыкания.
var createAssigner = function(keysFunc) {//console.log(keysFunc);
return function(obj) {
var length = arguments.length;
if (length < 2 || obj == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index],
keys = keysFunc(source),
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (obj[key] === void 0) obj[key] = source[key];
}
}
return obj;
};
};
var allKeys = function(obj) {
var keys = [];
for (var key in obj) keys.push(key);
return keys;
};
var extend = createAssigner(allKeys);
var john = {
firstname: 'John',
lastname: 'Doe'
}
var jane = {
address: '111 Main Street.',
getFormalFullName: function() {
return this.lastname + ', ' + this.firstname;
}
}
var jim = {
getFirstName: function() {
return firstname;
}
}
console.log(extend(john, jane, jim));
Код для расширения объекта john с помощью jane и jim без использования замыкания.
var createAssignerWithoutClosure = function() {
var length = arguments.length;
var target = arguments[0];
if (length < 2 || target == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index];
var keys = [];
for (var key in source) keys.push(key);
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (target[key] === void 0) target[key] = source[key];
}
}
return target;
};
var extendWithoutClosure = createAssignerWithoutClosure;
var john = {
firstname: 'John',
lastname: 'Doe'
}
var jane = {
address: '111 Main Street.',
getFormalFullName: function() {
return this.lastname + ', ' + this.firstname;
}
}
var jim = {
getFirstName: function() {
return firstname;
}
}
console.log(extendWithoutClosure(john, jane, jim));