将变量附加到Javascript中的函数有什么不好吗?

时间:2010-07-28 04:11:07

标签: javascript

我正在编写一些Javascript代码,我需要跟踪全局状态。只有一个函数才能改变状态,但需要从其他函数中广泛访问它。

我目前正以这种方式这样做:


function foo(bar) {
    var self = arguments.callee;
    if (!self.state) {
        self.state = 0; // called 0 times
    } else {
        self.state++; // increase the number of times i've been called
    }
}

将全局状态变量绑定到这样的函数是否明智?这很漂亮,但我担心我错过了一些危险的东西。

5 个答案:

答案 0 :(得分:2)

为函数对象分配属性没有任何问题。您应该担心的是,ECMAScript 5中不推荐arguments.callee,这是目前正在进入主流浏览器的最新语言规范。在严格模式下,引用arguments.callee会出错。

答案 1 :(得分:1)

没关系。人们一直使用构造函数来完成它。内置示例为String.fromCharCode

但是,如果其他功能不需要引用状态,我宁愿执行以下操作:

var foo = (function () {
  var state = 0;
  return function (bar) {
    state++;
  };
}) ();

即使他们确实需要引用它,我也许会尝试以某种方式使上述代码工作。甚至可以使用对象并避免使用类似单例的用法。

答案 2 :(得分:1)

我之前做过这样的事情。我认为它有点凌乱,但它不会引起第三次世界大战。

您可以在闭包内定义该函数,并将该闭包的本地变量置于本地,而不是这样做吗?

var foo = (function() {
  var state = 0;
  return function(bar) {
    state++;
  };
}());

foo(bar);

答案 3 :(得分:1)

没关系,你的状态变量永远不会是> 0.试试这个:

function foo(bar) {
    var self = arguments.callee;
    if (!self.state) { // Or, as trinithis suggested: if (self.state === undefined) {
        self.state = 1; // called once
    } else {
        self.state++; // increase the number of times i've been called
    }
}

答案 4 :(得分:1)

您可以将计数器设为只读,而不是公共字段。假设您想要计算对多个函数的调用,您甚至可以定义一个实用程序方法来使用此行为来包装函数:

function countCallsToFunc(func) {
  var count = 0;
  var self = function() {
    count++;
    func.apply(this, arguments);
  };
  self.getCount = function() {
    return count;
  };
  return self;
}

var foo = countCallsToFunc(function(bar) {
  // do something
});

foo();
foo();
alert(foo.getCount());