Javascript 创建静态(类似)变量-最佳实践

Javascript 创建静态(类似)变量-最佳实践,javascript,Javascript,每次我需要一个静态变量时,我都会将它作为属性附加到使用它并需要它持久化的对象上 特别是,这里的这个索引(MT.MAOrb.startR.index)我需要是静态的,或者保持它的值,直到回调函数再次调用为止 使用此表单是最好的方法吗 MT.MAOrb.startR.index /** ** MAOrb */ MT.MAOrb = { pre : function() { var o_p = { model : 'MAOrb'

每次我需要一个静态变量时,我都会将它作为属性附加到使用它并需要它持久化的对象上

特别是,这里的这个索引(
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
};

Javascript没有静态变量和非静态变量的概念:一切都只是对象的属性。因此,没有正确或错误的静态变量处理方法,只有正确或错误的静态类变量处理方法


也就是说,添加变量作为一个固定(类似模块)对象的属性,就像你正在做的一样,是你最好的选择(即最佳实践)。除非您使用的是像Backbone.js这样的库,它实际上为其“模型”(即它的类系统)添加了对静态变量的支持。

Javascript没有静态变量与非静态变量的概念:一切都只是对象的属性。因此,没有正确或错误的静态变量处理方法,只有正确或错误的静态类变量处理方法


也就是说,添加变量作为一个固定(类似模块)对象的属性,就像你正在做的一样,是你最好的选择(即最佳实践)。除非您使用的是像Backbone.js这样的库,它实际上在其“模型”(即它的类系统)中添加了对静态变量的支持。

如果您试图模拟公共静态属性,那么这是一种完全可行的方法

JavaScript不是一种经典的面向对象语言。它是典型的

一个分支是,语言中确实没有静态的概念


只要您不介意另一个对象可以直接读取和修改该属性,您这样做是完全正确的。

如果您试图模拟公共静态属性,那么这是一种完全正确的方法

JavaScript不是一种经典的面向对象语言。它是典型的

一个分支是,语言中确实没有静态的概念


只要你不介意另一个对象可以直接读取和修改属性,你这样做是完全正确的。

我认为这实际上是一种非常奇怪的方式。Javascript提供函数级作用域,您可以通过使用立即调用的函数表达式(IIFE)来利用它:


这可以被认为是更好的方法的一个原因是它完全隐藏了静态变量。如果要执行
myObject.count.staticCounter
,则其他一些代码可能正在读取或写入该变量。显然,您不希望发生这种情况,但如果您这样做,就可以完全保证该变量的作用域,从而在将来更容易调试和重构。

我想说,这实际上是一种相当奇怪的方法。Javascript提供函数级作用域,您可以通过使用立即调用的函数表达式(IIFE)来利用它:


这可以被认为是更好的方法的一个原因是它完全隐藏了静态变量。如果要执行
myObject.count.staticCounter
,则其他一些代码可能正在读取或写入该变量。显然,您不希望发生这种情况,但如果您这样做,就可以完全保证该变量的作用域,从而在将来更容易调试和重构。

这称为记忆化。如果正确使用,这对你有好处。这个漂亮的词……起源于60年代的人工智能研究……参考->我想你们都有点困惑;我在这段代码中根本看不到任何备忘录。记忆化(据我所知)包括用新版本的函数本身替换函数,新版本有一个保存计算的“快捷方式”。我看这里没有函数替换。这叫做记忆。如果正确使用,这对你有好处。这个漂亮的词……起源于60年代的人工智能研究……参考->我想你们都有点困惑;我在这段代码中根本看不到任何备忘录。记忆化(据我所知)包括用新版本的函数本身替换函数,新版本有一个保存计算的“快捷方式”。我看不到函数替换。你的生活使用了什么内存…我很难理解它“拉入”什么,所以我避免了生活是出于误解。没有真正的问题。它定义一个函数并立即执行。没有任何东西保存对该函数本身的引用(尽管它的作用域被保留),因此它不保存在内存中。这是当今Javascript中非常常见的模式。但是…在(执行时间和可能的额外内存利用率)与添加隐私(一个核心OO概念)之间的权衡是什么?没有任何东西包含对哪个函数的引用?“没有任何东西包含对哪个函数的引用?”-IIFE,外部函数。执行时间完全可以忽略不计。内存使用情况是相同的:一个额外的变量,存储在作用域或函数对象上。你的生活使用什么内存…我很难理解它“拉入”什么,所以我避免了IIFE的误解。没有真正的问题。它定义一个函数并立即执行。没有任何东西保存对该函数本身的引用(尽管它的作用域被保留),因此它不保存在内存中。这是当今Javascript中非常常见的模式。但是…在(执行时间和可能的额外内存利用率)与添加隐私(一个核心OO概念)之间的权衡是什么?没有任何东西包含对哪个函数的引用?“没有任何东西包含对哪个函数的引用?”-IIFE,外部函数。执行时间完全可以忽略不计。内存使用情况是相同的:一个额外的变量,存储在作用域中或funct上
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