JavaScript控制台中的静态变量

时间:2018-08-06 12:58:47

标签: javascript static

我没有得到上述代码的答案。 这里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

如果我在这里错了,那么您可以通过解释修改此示例。

3 个答案:

答案 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。 要获得增量值,您必须在函数范围之外声明变量。