![](/img/trans.png)
[英]Is there anything special about the init function in JavaScript objects?
[英]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.