此属性与javascript中的函数属性相对应

此属性与javascript中的函数属性相对应,javascript,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++ } ; } 这两件事本质上是一样的吗?

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

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


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

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


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

不,它们不是等效的。在第一个示例中,您使用的是
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
的实际变量,您现在正在其他地方以不同的方式使用该变量。如果你不是每次都以相同的方式调用它,那么
这将是不同的,
可能不会给出你想要的行为

如果您试图统计调用
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

不,它们不是等价的。在第一个示例中,您使用的是
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
的实际变量,您现在正在其他地方以不同的方式使用该变量。如果你不是每次都以相同的方式调用它,那么
这将是不同的,
可能不会给出你想要的行为

如果您试图统计调用
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

您需要了解Scope我对javascript中的实现没有任何线索,但是通常像
foo.counter
这样的构造使变量
counter
可以从任何
foo
对象中使用。(例如,
vara=newfoo();varb=newfoo());a.counter===b.counter;
。我不确定javascript是否也是这样。你是打算使用
foo
来创建使用
new
的对象,还是仅仅将其作为函数调用而不使用
new
?我的目标是将其作为函数调用。@Jack\u of_All\u Trades:然后阅读。你很快就会意识到这不是w你想要什么。你需要了解Scope我对javascript中的实现没有任何线索,但通常像
foo.counter
这样的构造使得变量
counter
可以从任何
foo
对象获得。(例如
var a=new foo();var b=new foo();a.counter===b.counter;
。我不确定javascript是否也是这样。你是打算使用
foo
来创建使用
new
的对象,还是仅仅将其作为函数调用而不使用
new
?我的目标是将其作为函数调用。@Jack\u of_All\u Trades:然后阅读。你很快就会意识到这不是w你想要什么。你能澄清一下,如果我有变量this.counter=1而不是this.counter=1在第一种情况下会发生什么?你会得到一个异常。
var
用于声明变量,而不是对象的属性。你能澄清一下,如果我有变量this.counter=1而不是this.counter=1在第一种情况下会发生什么吗?你会得到一个异常n、
var
用于声明变量,而不是对象的属性。这绝对澄清了我想了解的内容。谢谢Matt。@Jack_of_All_Trades很高兴能提供帮助!这绝对澄清了我想了解的内容。谢谢Matt。@Jack_of_All_Trades很高兴能提供帮助!