0

我想在我的 js 中创建一个静态变量。根据我对js的一点了解,我可以使用这两种方式来做到这一点。

function foo (){

    if (this.counter==undefined){this.counter=1}
    else {this.counter++ } ;

}

function foo (){

    if (foo.counter==undefined){foo.counter=1}
    else {foo.counter++ } ; 

}

这两件事本质上是否相同,或者我需要谨慎选择一个与另一个。

我的另一个问题是:为什么做这些时不需要 var ?

4

2 回答 2

2

不,它们不相等。在您的第一个示例中,您使用的是this. this实际上可以根据调用函数的方式而改变。

function showThis(){
    console.log(this);
}

var obj = { };
obj.showThis = showThis;

showThis(); // gives 'window', or the top-most scope of your page
obj.showThis(); // gives obj as 'this'

如果您始终以相同的方式调用该函数,那么这仅意味着该值counter被跟踪为window.counter. 这很糟糕,因为您可能不小心counter在该范围内命名了一个实际变量,您现在在其他地方以不同的方式使用它。如果您不是每次都以相同的方式调用它,那么this将会有所不同,并且可能不会给您想要的行为。

foo如果您试图计算被调用的次数,而与调用它的方式/谁无关,那么您的第二种方法更合适。为了代码澄清/约定,我会这样写:

function foo (){
    // If counter does not exist, create it and initialize it to 0.
    foo.counter = foo.counter || 0;
    foo.counter++;
}

foo.counter; // undefined, since foo has never been called yet
foo();
foo.counter; // is now 1
于 2013-07-19T14:07:01.813 回答
1

var用于在当前范围内创建变量。

您采用的两种方法都是在存在于更广泛范围内的对象上设置属性。

于 2013-07-19T13:58:33.007 回答