簡體   English   中英

將變量附加到Javascript函數中有什么不好的事情嗎?

[英]Is there anything bad about attaching a variable to a function in 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
    }
}

將全局狀態變量綁定到這樣的函數是否明智? 這很漂亮,但我擔心我錯過了一些危險的東西。

向函數對象分配屬性沒有錯。 您應該擔心的是arguments.callee在ECMAScript 5中已棄用,這是當前正在主流瀏覽器中使用的最新語言規范。 在嚴格模式下,引用arguments.callee將給出錯誤。

沒關系。 人們一直在使用構造函數來做到這一點。 內置示例為String.fromCharCode

但是,如果其他功能不需要引用狀態,則我希望執行以下操作:

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

即使他們確實需要引用它,我也可能會嘗試使上述代碼以某種方式起作用。 甚至使用對象,避免類似單例的用法。

我以前做過這樣的事情。 我認為這有點混亂,但是不會引起第三次世界大戰。

除了這樣做,您是否可以在閉包內部定義該函數,並使該閉包局部具有“ state”變量?

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

foo(bar);

可以,但是狀態變量永遠不會大於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
    }
}

您可以將計數器設為只讀,而不是公共領域。 假設您要計算對多個函數的調用,甚至可以定義一個實用程序方法來包裝具有以下行為的函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM