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.iCircle.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 コンストラクターで、(ローカル、オブジェクト自体に属する) variableへのクロージャーを作成しました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 に答える