这与javascript中的函数属性

时间:2013-07-19 13:53:22

标签: javascript

我想在我的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?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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