Необходимо ли реализовать метод createAssigner в underscore.js, используя только замыкание? - PullRequest
0 голосов
/ 19 сентября 2018

Необходимо ли реализовать метод 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));
...