【问题标题】:Is there anyway to tell if a function has a state in Javascript?有没有办法判断一个函数在 Javascript 中是否有状态?
【发布时间】:2020-08-07 00:48:28
【问题描述】:
a = function() {
    if(this.n === undefined) {
        this.n = 0;
    }
    this.n += 1;
    return(this.b);
}
b = function() {
    return(5);
}

在这种情况下,a 是有状态的,b 是无状态的。是否可以在javascript中创建一个函数hasSate(f),如果它具有a中的状态,则返回true,如果它没有b这样的状态,则返回false?如果是这样,你会怎么做?

【问题讨论】:

  • 一个更好的问题是为什么这样的东西需要是动态的?作为逻辑开发人员,您应该了解您的方法的作用。
  • return 不是方法。
  • 不,这是不可能的,因为状态是副作用。它不是语言的一部分。您可以测试一个函数是否由于有状态而是非幂等的(通过使用相同的参数调用它两次)。然而,这是一个坏主意,因为它会改变这种状态。并不是每个有状态的函数都是非幂等的。
  • @epascarello 这是有效的 JavaScript;以这种方式阅读它return (this.b); 如果您想评估代码并在同一行中提供返回值,它可能很有用,例如return (console.log('foo'), 5); 返回 5 并且也记录了 'foo'。为什么要这样做是另一回事,但关键是它是有效的代码。而且我认为我们不能假设 OP 不知道 return 是一个语句而不是一个方法。
  • @customcommander 我知道你为什么要这样做,但是在上面的代码中没有理由这样做。在过去的 20 多年里,我一直在告诉人们放弃 () 并返回。

标签: javascript function variables functional-programming closures


【解决方案1】:

您可以创建该函数的一个实例,并使用Object.getOwnPropertyNames 函数检查是否有与该新实例关联的属性名称。

let a = function() {
    if(this.n === undefined) {
        this.n = 0;
    }
    this.n += 1;
    return b();
}
let b = function() {
    return 5;
}


function hasState(fn) {
  let x = new fn();
  if(Object.getOwnPropertyNames(x).length > 0) {
     return true;
  }
  return false;
}

console.log(hasState(a))
console.log(hasState(b));

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多