我正在编写一些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
}
}
将全局状态变量绑定到这样的函数是否明智?这很漂亮,但我担心我错过了一些危险的东西。
答案 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());