每当我需要一个静态变量时,我最终将它作为一个属性添加到使用它的对象上,并且需要它保持不变。
特别是这里的索引(MT.MAOrb.startR.index
)我需要保持静态或保持它的值,直到回调再次调用该函数。
使用此表单是最好的方法吗?
MT.MAOrb.startR.index
/**
** MAOrb
*/
MT.MAOrb =
{
pre : function() {
var o_p = {
model : 'MAOrb'
};
return o_p;
},
post : function( o_p ) {
MT.MAOrb.startR( o_p );
},
startR: function( o_p ){
var sky = document.getElementById( 'Ab1' );
if( MT.MAOrb.startR.index === undefined ) {
var size = Object.size( o_p );
console.log( 'size' + size );
var index1 = MT.MAOrb.random( 0, size - 1 );
console.log( 'index1' + index1 );
MT.MAOrb.startR.index = index1;
MT.MAOrb.startR.o_p = o_p;
}else{
MT.MAOrb.startR.index++;
}
var image_element = MT.MAOrb.makeElement( MT.MAOrb.startR.o_p[ MT.MAOrb.startR.index ] );
sky.appendChild( image_element );
MT.MAOrb.moveLinear( image_element );
},// ....more code here
};
答案 0 :(得分:1)
Javascript没有静态变量和非静态变量的概念:一切都只是一个对象的属性。因此,没有正确或错误的方式来做静态变量,只有正确或错误的方式做静态变量。
话虽如此,将变量添加为固定(类似模块)对象的属性,正如您所做的那样,几乎是您最好的选择(即最佳实践)。除非您使用像Backbone.js这样的库,它实际上确实将静态变量的支持添加到其“模型”(即它的类系统)。
答案 1 :(得分:1)
如果您正在尝试模拟公共静态属性,那么这是一种完全A-OK方式。
JavaScript不是一种经典的面向对象语言。它是典型的。
一个结果是语言中确实没有静态概念。
你做的方式完全没问题,只要你不介意另一个对象可以直接读取和修改属性。
答案 2 :(得分:1)
我会说这实际上是一种相当奇怪的方式。 Javascript提供了函数级范围,您可以使用立即调用的函数表达式(IIFE)来利用它:
myObject = {
count: (function () { // this function is invoked immediately
var staticCounter = 0;
return function () { // this is the actual 'count' function
return ++staticCounter;
};
}())
};
myObject.count(); // 1
myObject.count(); // 2
这可以被认为是更好的方法的一个原因是它完全隐藏了静态变量。如果您要执行myObject.count.staticCounter
,其他一些代码可能正在读取或写入该变量。显然你不希望这种情况发生,但是如果你这样做,你就可以完全保证变量的范围,这将导致将来更容易调试和重构。