Javascript 在大多数OOP语言中,是否;我";在实例方法中,首先引用局部变量,然后引用全局变量,但决不引用实例变量或类变量?

Javascript 在大多数OOP语言中,是否;我";在实例方法中,首先引用局部变量,然后引用全局变量,但决不引用实例变量或类变量?,javascript,oop,instance-variables,class-variables,Javascript,Oop,Instance Variables,Class Variables,在以下代码中: <script type="text/javascript"> var i = 10; function Circle(radius) { this.r = radius; this.i = radius; } Circle.i = 123; Circle.prototype.area = function() { alert

在以下代码中:

    <script type="text/javascript">

        var i = 10;

        function Circle(radius) {
            this.r = radius;
            this.i = radius;
        }

        Circle.i = 123;

        Circle.prototype.area = function() { alert(i); }

        var c = new Circle(1);
        var a = c.area();

    </script>

var i=10;
功能圆(半径){
r=半径;
i=半径;
}
圆圈i=123;
Circle.prototype.area=函数(){alert(i);}
var c=新的圆圈(1);
var a=c.面积();
警报是什么?答案在这个问题的末尾

我发现警报调用中的
I
要么引用任何局部变量(如果有的话),要么引用全局变量。即使没有定义局部变量和全局变量,也无法将其作为实例变量或类变量。要引用实例变量
i
,我们需要
this.i
,而要引用类变量
i
,我们需要
Circle.i
。几乎所有面向对象编程语言都是这样吗?有例外吗?是否存在这样的情况:当没有局部变量和全局变量时,它将查找实例变量,然后查找类变量范围?(或者在这种情况下,这些被称为范围?)


答案是:10正在被警告。

您看到的是一个关闭

如果您想要这个.i或圆.i,您必须明确地引用它们


就像在Python(self.x和cls.x)中一样,Javascript对于实例或类/原型属性没有语法糖。

您看到的是一个闭包

如果您想要这个.i或圆.i,您必须明确地引用它们


就像在Python(self.x和cls.x)中一样,Javascript没有实例或类/原型属性的语法糖。

在通用面向对象编程语言中,实例变量(如名称所示)只能通过类的实例访问(可通过类名访问的静态变量除外)。因此,当您想要引用实例变量时,您需要拥有类的对象(实例)。

在通用面向对象编程语言中,实例变量(如名称所示)只能通过类的实例访问(可通过类名访问的静态变量除外)。因此,当您想要引用实例变量时,您需要拥有类的对象(实例)。

要引用实例变量,您必须使用
this.i
Circle.i
引用
Circle
构造函数上的静态属性——它对
Circle
的实例没有影响要引用实例变量,必须使用
this.i
Circle.i
引用
Circle
构造函数上的静态属性——它不会影响
Circle

的实例

大多数语言都允许您访问实例变量,而无需使用类似于
this.i
的东西来指定它是实例变量

真正面向对象的语言,如Java、C#和VB(7+),甚至没有任何全局变量

Javascript并不是一种面向对象的语言,它是一种过程语言,对面向对象的支持有限。由于它没有类,因此没有任何类作用域,因此需要使用
this
关键字指定对象作用域。

不,这不是真的

大多数语言都允许您访问实例变量,而无需使用类似于
this.i
的东西来指定它是实例变量

真正面向对象的语言,如Java、C#和VB(7+),甚至没有任何全局变量

Javascript并不是一种面向对象的语言,它是一种过程语言,对面向对象的支持有限。由于它没有类,因此没有任何类作用域,因此需要使用
this
关键字指定对象作用域。

var i = 10;

function Circle(radius) {
            var i = radius || 0;
            this.r = i;
            this.i = radius;
            this.toString = function(){ return i; };
        }    
var nwCircle = new Circle(45);

alert(nwCircle.r); //=>45;
alert(nwCircle); //=>45 (toString found local i);
alert(i); //=>10
现在,在循环构造函数中,您创建了(本地,属于对象本身)变量
i
的闭包。全局定义的
i
不受影响。因此,在javascript中,它取决于定义变量的位置。至少在javascript中,对
i
执行自下而上的搜索(从本地范围到全局范围),并使用找到的第一个搜索。因此,如果
Circle
构造函数不包含名为
i
的变量,则将使用全局
i

请注意:

var i = 10;

function Circle(radius) {
            var i = radius || 0;
            this.r = i;
            this.i = radius;
            this.toString = function(){ return i; };
        }    
var nwCircle = new Circle(45);

alert(nwCircle.r); //=>45;
alert(nwCircle); //=>45 (toString found local i);
alert(i); //=>10

现在,在循环构造函数中,您创建了(本地,属于对象本身)变量
i
的闭包。全局定义的
i
不受影响。因此,在javascript中,它取决于定义变量的位置。至少在javascript中,对
i
执行自下而上的搜索(从本地范围到全局范围),并使用找到的第一个搜索。因此,如果
Circle
构造函数不包含名为
i
的变量,则将使用全局
i

wiki,因为它可能涉及不同的语言,并且可能会有不同的人提到一些不同的情况。这显然是JavaScript中的一个错误。这对于JavaScript非常具体(或类似语言),与“大多数面向对象语言”没有什么关系。@deceze在其他一些语言中有什么区别?在基于类(C/Java风格)的语言中,面向对象的实例方法不能在类定义之外定义(为“良好的实际情况”做好准备…)因此,它们的范围显然仅限于它们所属的类/对象。基于原型的面向对象语言的工作方式大不相同,因为方法可以从对象之外的范围附加到对象(正如您所做的那样),因为它可能涉及不同的语言,不同的人可能会提到一些不同的情况,这显然是JavaScript中的一个错误