Javascript 局部静态变量

goo*_*ion 8 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},
    ];
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

根据我找到的一些答案(例如这个答案),我需要在初始化之前使用以下内容:

if (typeof func.PARAMS == 'undefined')
Run Code Online (Sandbox Code Playgroud)

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

Get*_*ree 14

除了使用函数对象的属性之外,正如您在示例中所做的那样,还有 3 种其他方法可以在 Javascript 中模拟函数局部静态变量。

它们都依赖于闭包,但使用不同的语法。

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

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

someFunc1() ; //prints 1
someFunc1() ; //prints 2
someFunc1() ; //prints 3
Run Code Online (Sandbox Code Playgroud)

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

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

someFunc2() ; //prints 1
someFunc2() ; //prints 2
someFunc2() ; //prints 3
Run Code Online (Sandbox Code Playgroud)

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

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

someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3
Run Code Online (Sandbox Code Playgroud)

严格模式的方法3 :

'use strict'
{
    let staticVar = 0 ;
    var someFunc3 = function(){
        alert(++staticVar) ;
    } ;
}

someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3
Run Code Online (Sandbox Code Playgroud)