Javascript本地静态变量

时间:2018-02-22 08:48:00

标签: javascript static static-variables

我不确定我是否完全理解我在这里找到的类似问题的答案,所以要尽力确保:

我想在函数中有一个局部变量,只初始化一次(类似于强类型语言中的静态变量,如C,C ++等)。

当然,我可以在全局范围内声明它,但似乎更好的做法是将它放在该函数的范围内,因为它不会在其他任何地方使用。

现在,我正在做的事情:

function func(data) {
    func.PARAMS = [
        {"name": "from", "size": 160, "indexed": true},
        {"name": "input", "size": 256, "indexed": false},
        {"name": "output", "size": 256, "indexed": false},
    ];
    ...
}

我的问题是,func.PARAMS确实只会初始化一次,还是每次调用函数时都会被初始化?

根据我发现的一些答案(例如this one),我需要在初始化之前使用以下内容:

if (typeof func.PARAMS == 'undefined')

这"补充"当然,在强类型语言中无关紧要,所以我只想确保它是绝对必要的,以确保静态行为" (即一次性初始化)。

谢谢!!!

4 个答案:

答案 0 :(得分:3)

除了使用函数对象的属性之外,就像在您的示例中一样,还有其他3种方法可以在Javascript中模拟函数本地静态变量。

所有这些都依赖于闭包,但使用不同的语法。

方法1(旧浏览器支持):

var someFunc1 = (function(){
    var staticVar = 0 ;
    return function(){
        alert(++staticVar) ;
    }
})() ;

someFunc1() ; //prints 1
someFunc1() ; //prints 2
someFunc1() ; //prints 3

方法2(旧浏览器也支持):

var someFunc2 ;
with({staticVar:0})
    var someFunc2 = function(){
        alert(++staticVar) ;
    } ;

someFunc2() ; //prints 1
someFunc2() ; //prints 2
someFunc2() ; //prints 3

方法3(需要支持EcmaScript 2015):

{
    let staticVar = 0 ;
    function someFunc3(){
        alert(++staticVar) ;
    }
}

someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3

答案 1 :(得分:0)

每次调用函数时都会分配它。 JavaScript中没有static个变量。你需要在函数之外声明它们。但是,您可以在本地范围内执行此操作:

var func;
{
    const PARAMS = [
        {"name": "from", "size": 160, "indexed": true},
        {"name": "input", "size": 256, "indexed": false},
        {"name": "output", "size": 256, "indexed": false},
    ];
    func = function(data) {
        …
    }
}

答案 2 :(得分:-1)

虽然Javascript本身并不具有静态变量的概念,但很容易模拟它们。一个带有对象的模式是使用闭包(通过自调用函数)。

const MyClass = ( function() {

    // Static variables are in the scope of the self-invoking function

    const _myStaticVariable = 'this is a static variable';
      let _instances = 0; // this is also a class variable

    // The constructor function is returned to MyClass, but still has the static variables in scope

    return function() {

        _instances++;

        this.sayStaticVariable = function(){
            console.log(_myStaticVariable);
        }

        this.howMany = function(){
            console.log(_instances);
        }
    }

})();

myInstance = new MyClass();

myInstance.sayStaticVariable();
// this is a static variable

myInstance.howMany();
// 1

在这种情况下,_myStaticVariable_instances只会被初始化一次,但仍然在返回MyClass的构造函数的范围内(并且可以访问)。

由于您似乎在函数而不是对象的上下文中询问静态变量,您可能可以使用函数式组合来调整此模式

答案 3 :(得分:-1)

JavaScript可能看起来与C ++类似,但事实上,它非常不同。最初,它是为浏览器中的简单任务而制作的。在JS程序员中模仿类似C ++的功能创建复杂的结构。例如,在ES6中现在有类,但实际上,它们只是依赖于原型继承的构造函数的语法糖。在ES6中,现在可能需要检查静态方法。

我想在你的情况下,最好使用更像C#的TypeScript,并且是JavaScript的超集。