代码之家  ›  专栏  ›  技术社区  ›  Long Ouyang

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

  •  1
  • Long Ouyang  · 技术社区  · 15 年前

    我现在是这样做的:

    
    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 回复  |  直到 15 年前
        1
  •  2
  •   Tim Down    15 年前

    为函数对象指定属性没有错。你应该担心的是 arguments.callee 在ECMAScript 5中已被弃用,这是目前进入主流浏览器的最新语言规范。在严格模式中,指 参数.被调用方 将给出一个错误。

        2
  •  1
  •   Thomas Eding    15 年前

    没事的。人们总是用构造函数来实现。一个内置的例子是 String.fromCharCode

    但是,如果其他函数不需要引用状态,我希望执行以下操作:

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

        3
  •  1
  •   thomasrutter    15 年前

    我以前也做过这样的事。我觉得有点乱,但不会引起第三次世界大战。

    与其这样做,不如在闭包中定义该函数,并使“state”变量位于该闭包的局部?

    var foo = (function() {
      var state = 0;
      return function(bar) {
        state++;
      };
    }());
    
    foo(bar);
    
        4
  •  1
  •   Dan Breslau    15 年前

    很好,只是状态变量永远不会是>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
        }
    }
    
        5
  •  1
  •   Douglas    15 年前

    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());