0

在以下代码中:

    <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>

什么被警告?答案在这个问题的最后。

我发现i警报调用中的 要么是指任何本地(如果有),要么是全局变量。即使没有定义局部变量和全局变量,也不可能是实例变量或类变量。要引用实例变量i,我们需要this.i,而要引用类变量i,我们需要Circle.i。这对几乎所有面向对象的编程语言来说都是真的吗?有什么例外吗?有没有局部没有全局的情况下,先查找实例变量,再查找类变量作用域?(或者在这种情况下,那些称为范围?)

答案是:10 正在收到警报。

4

5 回答 5

1

你看到的是一个闭包。

http://www.jibbering.com/faq/faq_notes/closures.html

如果你想要 this.i 或 Circle.i,你必须明确地引用它们。

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

于 2010-05-06T08:41:44.677 回答
1

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

于 2010-05-06T08:50:32.580 回答
1

看哪:

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

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

于 2010-05-06T09:02:41.177 回答
0

在一般的面向对象编程语言中,实例变量(顾名思义)只能通过类的实例来访问(静态变量除外,可以通过类名访问)。因此,当您想要引用实例变量时,您需要拥有该类的对象(实例)。

于 2010-05-06T08:49:43.017 回答
0

不,那不是真的。

大多数语言将允许您访问实例变量,而无需使用诸如this.i指定它是实例变量之类的东西。

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

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

于 2010-05-06T08:50:52.927 回答