Javascript 局部静态变量
Javascript local static variable
不确定我是否完全理解我在此处找到的类似问题的答案,因此尝试绝对确定:
我想在函数中有一个局部变量,只初始化一次(类似于 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')
这个 "supplemental" 当然在强类型语言中是无关紧要的,所以我只想确定它是绝对必要的,以确保 "static behavior" (即一次性初始化).
每次函数调用时都会赋值。 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) {
…
}
}
虽然Javascript本身没有静态变量的概念,但是很容易模拟出来。对象的一种模式是使用闭包(通过 self-invoking 函数)。
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 的构造函数的范围内(并且可以访问)。
由于您似乎是在函数而不是对象的上下文中询问静态变量,您可能可以使用函数组合来调整此模式
JavaScript 可能看起来与 C++ 类似,但实际上,它非常不同。最初,它是为浏览器中的简单任务而设计的。为了模仿 JS 程序员中类似 C++ 的功能,创建了复杂的结构。例如,在 ES6 中现在有 类 但实际上,它们只是依赖原型继承的构造函数的语法糖。在 ES6 中,现在您可能需要检查静态方法。
我想在你的情况下,最好使用更像 C# 的 TypeScript,它是 JavaScript 的超集。
除了使用函数对象的属性(如您在示例中所做的那样)之外,还有其他 3 种方法可以在 Javascript.
中模拟函数局部静态变量
它们都依赖于闭包,但使用不同的语法。
方法一(旧浏览器支持):
var someFunc1 = (function(){
var staticVar = 0 ;
return function(){
alert(++staticVar) ;
}
})() ;
someFunc1() ; //prints 1
someFunc1() ; //prints 2
someFunc1() ; //prints 3
方法二(旧浏览器也支持):
var someFunc2 ;
with({staticVar:0})
var someFunc2 = function(){
alert(++staticVar) ;
} ;
someFunc2() ; //prints 1
someFunc2() ; //prints 2
someFunc2() ; //prints 3
方法三(需要支持EcmaScript 2015):
{
let staticVar = 0 ;
function someFunc3(){
alert(++staticVar) ;
}
}
someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3
方法 3 strict mode:
'use strict'
{
let staticVar = 0 ;
var someFunc3 = function(){
alert(++staticVar) ;
} ;
}
someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3
不确定我是否完全理解我在此处找到的类似问题的答案,因此尝试绝对确定:
我想在函数中有一个局部变量,只初始化一次(类似于 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')
这个 "supplemental" 当然在强类型语言中是无关紧要的,所以我只想确定它是绝对必要的,以确保 "static behavior" (即一次性初始化).
每次函数调用时都会赋值。 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) {
…
}
}
虽然Javascript本身没有静态变量的概念,但是很容易模拟出来。对象的一种模式是使用闭包(通过 self-invoking 函数)。
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 的构造函数的范围内(并且可以访问)。
由于您似乎是在函数而不是对象的上下文中询问静态变量,您可能可以使用函数组合来调整此模式
JavaScript 可能看起来与 C++ 类似,但实际上,它非常不同。最初,它是为浏览器中的简单任务而设计的。为了模仿 JS 程序员中类似 C++ 的功能,创建了复杂的结构。例如,在 ES6 中现在有 类 但实际上,它们只是依赖原型继承的构造函数的语法糖。在 ES6 中,现在您可能需要检查静态方法。
我想在你的情况下,最好使用更像 C# 的 TypeScript,它是 JavaScript 的超集。
除了使用函数对象的属性(如您在示例中所做的那样)之外,还有其他 3 种方法可以在 Javascript.
中模拟函数局部静态变量它们都依赖于闭包,但使用不同的语法。
方法一(旧浏览器支持):
var someFunc1 = (function(){
var staticVar = 0 ;
return function(){
alert(++staticVar) ;
}
})() ;
someFunc1() ; //prints 1
someFunc1() ; //prints 2
someFunc1() ; //prints 3
方法二(旧浏览器也支持):
var someFunc2 ;
with({staticVar:0})
var someFunc2 = function(){
alert(++staticVar) ;
} ;
someFunc2() ; //prints 1
someFunc2() ; //prints 2
someFunc2() ; //prints 3
方法三(需要支持EcmaScript 2015):
{
let staticVar = 0 ;
function someFunc3(){
alert(++staticVar) ;
}
}
someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3
方法 3 strict mode:
'use strict'
{
let staticVar = 0 ;
var someFunc3 = function(){
alert(++staticVar) ;
} ;
}
someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3