javascript:当使用new调用函数时,函数能否创建静态变量?

javascript:当使用new调用函数时,函数能否创建静态变量?,javascript,Javascript,我熟悉java中的静态变量和实例变量 我可以看到javascript没有“static”关键字 我可以看到,一个函数和它可以看到的变量,在它自身之外,非常像一个对象 在javascript控制台上进行实验,我看到了这一点 this.rrr=将在函数外部创建一个变量,如果函数是用new调用的,那么它将创建一个实例变量——对象上下文中的一个变量。然而,如果函数在没有new的情况下被调用,那么它只是在自身之外设置变量,没有对象,因此它本质上是一个静态变量 当然,毫无疑问,对于java(如果我记得的话)

我熟悉java中的静态变量和实例变量

我可以看到javascript没有“static”关键字

我可以看到,一个函数和它可以看到的变量,在它自身之外,非常像一个对象

在javascript控制台上进行实验,我看到了这一点

this.rrr=将在函数外部创建一个变量,如果函数是用new调用的,那么它将创建一个实例变量——对象上下文中的一个变量。然而,如果函数在没有new的情况下被调用,那么它只是在自身之外设置变量,没有对象,因此它本质上是一个静态变量

当然,毫无疑问,对于java(如果我记得的话),对象可以引用静态变量,但是静态方法不能引用实例变量。因此,如果我们在没有“new”的情况下调用函数,那么它就没有可引用的实例变量。但是如果我们用new调用函数,那么它应该能够引用实例或静态变量。由于在javascript中可以在函数之外创建变量,因此可能可以创建实例变量或静态变量。。我知道,在调用函数时不使用new,可以创建一个静态变量。当用new创建时,您可以创建一个实例变量。。但是,当使用new创建函数时,是否也可以创建静态变量

我设置了一个变量rrr=1,它本质上是一个静态变量,因为它不是任何对象的一部分

>rrr=1
1
我知道this.rrr可以在p对象中设置rrr变量,也可以设置静态rrr变量。我知道asd()这个名字是多余的,这个函数可能是匿名的,也可能是匿名的

>var p=function asd() {this.rrr=55;}


>p();

>rrr
55

>rrr=1
1
我可以在上面看到,p()将静态变量rrr设置为55,然后在上面将rrr设置为1

>rrr
1


>var q=new p(); 

>rrr
1
我知道q.rrr将由上述设定

>q=p();

>rrr
55
以上结果都没有让我感到惊讶。一切如期而至。但这些例子澄清了我的问题

可以调用q=newp()吗;在p函数中写了什么,设置静态rrr


就像java中的实例方法如何设置静态变量一样,在java中,它通过指定类名dot variable name来设置静态变量,而不是使用“this”。我想知道javascript是否有办法?

this.rrr=55并没有真正创建“静态变量”,至少如果您的意思是与Java中的静态类属性类似的话,就不会这样
仅指全局窗口对象(因为您不在这里的“对象上下文”中,就像您在
new p()中一样)
,因此您刚刚创建了
window.rrr
,因此它只是一个普通的全局变量。如果您刚刚在函数内部直接为
rrr
赋值,效果也会一样

那么javascript中的实例变量的术语是什么?比如当用“new”调用函数时.rrr=创建了什么

考虑这个例子:

function Foo() {
    this.bar = 1;
    var baz = 2;
}

var someObj = new Foo();

console.log(someObj.bar); // this will get you 1
console.log(someObj.baz); // this will only get you undefined
因此,对象上下文中的
this.bar
与可从外部访问的
public
属性相当,而
var baz
是函数范围的局部属性(因为
var
关键字),因此与
private
属性相当


我宁愿说“可比”,而不是完全相同……因为JavaScript现在并不是真正的“类”概念,而是(函数)对象,应用与“经典”OOP中相同的术语(哈,双关语)可能没有多大意义。

this.rrr=55;
在函数中并不会真正创建“静态变量”,如果您的意思是与Java中的静态类属性类似的话,至少不是这样。
仅指全局
窗口
对象,因此您刚刚创建了
窗口.rrr
,因此它只是一个普通的全局变量。如果您刚刚在函数中直接为
rrr
赋值,则ffect应该是相同的…@CBroe啊,因此函数中的rrr=5不会创建一个作用域为函数的变量..有趣..并且与window.rrr相同,您可以将其作为答案发布。那么javascript中的实例变量的术语是什么呢?就像这个.rrr=在使用“new”调用函数时创建的一样?好的,这与站姿变量是对象上下文中的变量,与静态变量等效的变量是窗口上下文中的变量。您可以在函数中添加一个baf=3;不带var或window.baf来显示窗口上下文中变量的示例。这样,您的函数就可以显示所有3个变量。函数范围/上下文、全局范围/上下文、对象范围/上下文我看到窗口。variablename=vs variablename=区分参数和创建一个外部变量“和等价的静态变量,是窗口上下文中的变量”-不,不是真的;它们与您的“类”(这里是我们的函数)无关以任何方式。脚本的任何部分都可以访问它们(因此您不会以这种方式创建私有静态变量),如果两个不同的“类”都为
foo
赋值,那么它将被覆盖。