Увеличивает, изменяя каждую функцию, выполняемую как переменная - PullRequest
0 голосов
/ 05 января 2019

Я нашел простое решение здесь , используя closure из @ Xotic750

Но можно ли запустить функцию без круглых скобок? Е.Г. :

var increment = new Increment()

console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3

При каждом запуске функции я получаю функцию в виде [object Object] в console.log вместо value:

    var Increment = (function(n) {
      return function() {
        n += 1;
        return n;
      }
    }(0)); 

    var increment = new Increment();

    console.log('value: ' + increment) // value: [object Object]
    console.log('value: ' + increment) // value: [object Object]
    console.log('value: ' + increment) // value: [object Object]

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Можно ли запустить функцию без круглых скобок

Да, вы можете сделать это, используя getter , вот пример:

class Cls {
   constructor() {
      this.value = 0;
   }
   get increment() {
      return this.value++
   }
}

const cls = new Cls()

console.log('value: ' + cls.increment)
console.log('value: ' + cls.increment)
console.log('value: ' + cls.increment)
0 голосов
/ 05 января 2019

Когда вы печатаете экземпляры increment, происходит преобразование toString. Вы можете использовать это для выполнения приращения:

var Increment = (function(n) {
  var f = function() {}; // Only serves as constructor
  f.prototype.toString = function() {
    n += 1;
    return n;
  }
  return f
}(0)); 

var increment = new Increment();

console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3    

Имейте в виду, счетчик своего рода глобальный. Если вы хотите, чтобы счетчик был отдельным и перезапускался с 0 для каждого экземпляра, используйте this:

var Increment = (function(n) {
  var f = function() {
      this.n = 0;
  };
  f.prototype.toString = function() {
    this.n += 1;
    return this.n;
  }
  return f
}(0)); 

var increment = new Increment();

console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3

increment = new Increment();

console.log('value: ' + increment) // value: 1
console.log('value: ' + increment) // value: 2
console.log('value: ' + increment) // value: 3
0 голосов
/ 05 января 2019

Вы создаете объект функции Increment с помощью ключевого слова new. В вашем случае вы просто захотите вызвать функцию Increment следующим образом:

console.log('value: ' + Increment());
console.log('value: ' + Increment());
console.log('value: ' + Increment());

См. Эту ссылку на Закрытия для более подробного объяснения того, как они работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...