递增更改每个函数作为变量运行

时间:2019-01-04 21:49:26

标签: javascript function variables closures

我从here使用closure找到了简单的解决方案@Xotic750

但是,没有括号就可以运行功能吗? E.G。

var increment = new Increment()

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

每个函数运行时,我在[object Object]中得到的{em> function 为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 :(得分:2)

在打印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

答案 1 :(得分:1)

您正在通过使用Increment关键字来创建函数new的对象。就您而言,您只想这样调用Increment函数:

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

请参见Closures上的此链接,以获取有关其工作方式的更详细说明。

答案 2 :(得分:1)

  

是否可以在没有圆括号的情况下运行功能

是的,您可以使用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)