在javascript中声明静态变量

在javascript中声明静态变量,javascript,variables,static,Javascript,Variables,Static,在上面的程序中,我希望每次调用函数时“i”的值都应该增加,并且在整个程序中都应该是相同的,就像静态变量一样。 如何操作?您可以拥有一个名为globals.js的javascript文件(不要忘记将其包含在index.html中),然后声明您的全局变量,该变量将在所有web解决方案中可用 globals.js: yourFile.js: 您可以有一个名为globals.js的javascript文件(不要忘记将其包含在index.html中),然后声明您的全局变量,该变量将在所有web解决方案中可

在上面的程序中,我希望每次调用函数时“i”的值都应该增加,并且在整个程序中都应该是相同的,就像静态变量一样。
如何操作?

您可以拥有一个名为globals.js的javascript文件(不要忘记将其包含在index.html中),然后声明您的全局变量,该变量将在所有web解决方案中可用

globals.js:

yourFile.js:


您可以有一个名为globals.js的javascript文件(不要忘记将其包含在index.html中),然后声明您的全局变量,该变量将在所有web解决方案中可用

globals.js:

yourFile.js:


JS变量是函数的局部变量或全局变量。因为您在函数外部声明了
i
,所以它是全局的

要证明这一点,请将其另存为test.html,在浏览器中打开它并按几次按钮。我简化了你的功能

 function mul()
 {
   var qty = document.getElementsByClassName("qty");
   var rs = document.getElementsByClassName("rs");
   var amt = document.getElementsByClassName("amt");
   var mul=(qty[_i].value)*(rs[_i].value);
   amt[_i].setAttribute("value",mul);
   sp.appendChild(iteminp);
   sp.appendChild(qtyinp);
   sp.appendChild(rsinp);
   sp.appendChild(amtinp);
   _i++;
}

变量i=0
函数mul(){
警报(“i:+i++”)
}
按我

JS变量是函数的局部变量或全局变量。因为您在函数外部声明了
i
,所以它是全局的

要证明这一点,请将其另存为test.html,在浏览器中打开它并按几次按钮。我简化了你的功能

 function mul()
 {
   var qty = document.getElementsByClassName("qty");
   var rs = document.getElementsByClassName("rs");
   var amt = document.getElementsByClassName("amt");
   var mul=(qty[_i].value)*(rs[_i].value);
   amt[_i].setAttribute("value",mul);
   sp.appendChild(iteminp);
   sp.appendChild(qtyinp);
   sp.appendChild(rsinp);
   sp.appendChild(amtinp);
   _i++;
}

变量i=0
函数mul(){
警报(“i:+i++”)
}
按我

您可以创建一个decorator函数,该函数可以用计数器包装您的函数,该计数器允许您通过只读属性访问计数

由于使用了
Symbol
,此解决方案将需要现代浏览器,但您可以用dunder属性代替它,例如在它的位置上使用
\uuuuu count\uuuu

//用于在函数上创建privaty属性
常数计数=符号类型!='未定义的'?符号(“计数”):“\uuuuuuuuuuuuuu计数”
//此函数接受您的函数并用计数器包装它
功能计数器(fn){
//无论何时调用修饰函数,都会调用该函数
函数_计数器(…参数){
//递增计数器
_计数器[计数]++
//调用原始函数
返回fn(…args)
}
//在函数和访问器上创建私有属性
Object.defineProperties(_计数器{
[计数]:{值:0,可写:true},
名称:{value:fn.name | |'counter'},
计数:{get:()=>u计数器[count]}
})
//返回decorator函数
返回计数器
}
//装饰功能
函数_mul(x,y){
//做些事情来繁殖
返回x*y
}
//用柜台装饰你的功能
const mul=计数器(_mul)
常数mul2=计数器(_mul)
//证明两个计数器独立且工作正常
console.log(
mul(1,2),//2
mul(3,4),//12
`mul已被调用${mul.count}次`
)
console.log(
mul2(5,6),//30
mul2(7,8),//56
mul2(9,10),//90
`mul2已被调用${mul2.count}次`
)

您可以创建一个decorator函数,该函数可以使用计数器包装您的函数,该计数器将允许您通过只读属性访问计数

由于使用了
Symbol
,此解决方案将需要现代浏览器,但您可以用dunder属性代替它,例如在它的位置上使用
\uuuuu count\uuuu

//用于在函数上创建privaty属性
常数计数=符号类型!='未定义的'?符号(“计数”):“\uuuuuuuuuuuuuu计数”
//此函数接受您的函数并用计数器包装它
功能计数器(fn){
//无论何时调用修饰函数,都会调用该函数
函数_计数器(…参数){
//递增计数器
_计数器[计数]++
//调用原始函数
返回fn(…args)
}
//在函数和访问器上创建私有属性
Object.defineProperties(_计数器{
[计数]:{值:0,可写:true},
名称:{value:fn.name | |'counter'},
计数:{get:()=>u计数器[count]}
})
//返回decorator函数
返回计数器
}
//装饰功能
函数_mul(x,y){
//做些事情来繁殖
返回x*y
}
//用柜台装饰你的功能
const mul=计数器(_mul)
常数mul2=计数器(_mul)
//证明两个计数器独立且工作正常
console.log(
mul(1,2),//2
mul(3,4),//12
`mul已被调用${mul.count}次`
)
console.log(
mul2(5,6),//30
mul2(7,8),//56
mul2(9,10),//90
`mul2已被调用${mul2.count}次`
)

有什么问题吗?就是这样。它是全局的,因此每个函数都会看到相同的
i
。只需在
i
之前删除
var
。然后,
i
将是一个全局变量,
i
没有任何地方被认为是静态的。您只是想要一个全局变量吗?如果是,则将其声明为
窗口。\u i=1,但这似乎是一种不好的实现方法。(通常的做法是在全局变量前面加一个下划线,当然不要只叫它
i
)问题出在哪里?就是这样。它是全局的,因此每个函数都会看到相同的
i
。只需在
i
之前删除
var
。然后,
i
将是一个全局变量,
i
没有任何地方被认为是静态的。您只是想要一个全局变量吗?如果是,则将其声明为
窗口。\u i=1,但这似乎是一种不好的实现方法。(通常的做法是在全局变量前面加下划线,当然不要只称它为
i
)不,您可以看到上面的代码,我确实喜欢这样做,但是,如果我第二次调用该函数,它会显示一个错误,“Uncaught TypeError:无法读取undefined的属性'value'”我认为错误信息来自这一行:
(qty[I].value)*(rs[I].value)
-如果
qty[I]
rs[I]
不计算到某个值(因为
qty
rs function mul()
 {
   var qty = document.getElementsByClassName("qty");
   var rs = document.getElementsByClassName("rs");
   var amt = document.getElementsByClassName("amt");
   var mul=(qty[_i].value)*(rs[_i].value);
   amt[_i].setAttribute("value",mul);
   sp.appendChild(iteminp);
   sp.appendChild(qtyinp);
   sp.appendChild(rsinp);
   sp.appendChild(amtinp);
   _i++;
}
<script>
var i=0
function mul(){
  alert("i: " + i++)
}
</script>
<button onclick='mul()'>Press me</button>