我没有得到上述代码的答案。
这里foo.staticVar
是静态变量,
normalVar
是普通变量。
但是我对他们两个都有相同的看法。
function foo(){
foo.staticVar = 0; // Static variable
normalVar = 0; // Normal variable
console.log('foo.staticVar = ',++foo.staticVar);
console.log('normalVar =', ++normalVar);
}
var a = new foo();
var b = new foo();
var c = new foo();
输出
我的假设:
foo.staticVar = 1
normalVar = 1
foo.staticVar = 2
normalVar = 1
foo.staticVar = 3
normalVar = 1
实际输出:
foo.staticVar = 1
normalVar = 1
foo.staticVar = 1
normalVar = 1
foo.staticVar = 1
normalVar = 1
如果我在这里错了,那么您可以通过解释修改此示例。
答案 0 :(得分:1)
执行new foo
时,您正在呼叫 foo
,这自然意味着foo
中的这行代码:
foo.staticVar = 0;
每次执行,清除foo.staticVar
的所有先前值,然后将其替换为0
。
相反,要查看不同之处,请将foo.staticVar = 0;
外面 foo
移动。另外,您还忘记了声明normalVar
,因此您的代码成为我所谓的The Horror of Implicit Globals的牺牲品。您想声明它以便它是本地的:
function Foo() {
var normalVar = 0; // Normal variable
console.log('Foo.staticVar = ', ++Foo.staticVar);
console.log('normalVar =', ++normalVar);
}
Foo.staticVar = 0; // Static data member
var a = new Foo();
var b = new Foo();
var c = new Foo();
可能值得指出的是,staticVar
没有什么特别之处。实际上,它只是Foo
所引用的功能对象上的一个属性,就像其他任何对象属性一样。
侧面说明:JavaScript中的压倒性约定是构造函数(将与new
一起使用的函数)以大写字母开头。因此,Foo
而不是foo
。我已经在上面的实时示例中对其进行了更改。
旁注2:如果static class fields提案向前发展(很可能目前处于the process的第3阶段),您将可以使用{ {1}}和该提案的语法:
class
答案 1 :(得分:0)
Because you are initializing that variable in the function that's why every time the function called..variable initializes with 0..if you initialize that variable out of the function then you'll get desired result i.e `
var normalVar = 0;
function foo(){
foo.staticVar = 0; // Static variable
console.log('foo.staticVar = ',++foo.staticVar);
console.log('normalVar =', ++normalVar);
}
var a = foo();
var b = foo();
var c = foo();`
答案 2 :(得分:-1)
每当您将函数foo声明为已声明要重新初始化的变量,因此您总是将两个变量都设为1。 要获得增量值,您必须在函数范围之外声明变量。