js は、ローカル変数、クラス変数、プライベート変数、インスタンス変数、静的変数、グローバル変数のタイプの変数をサポートしています。
ローカル変数:
ローカル変数は通常、{} のスコープ内で有効な変数、つまり次のようなステートメント ブロック内で有効な変数を指します:
function foo(flag) { var sum = 0; if(flag == true) { var index; for(index=0;index<10;index++) { sum +=index; } } document.write("index is :"+index+"<br>"); return sum; } //document.write("sum is :" +sum+"<br>"); document.write("result is :"+foo(true)+"<br>");
コード実行後の出力結果is: "index is :unknown" and "result is:0" とすると、出力したいインデックス変数の値が未定義、つまり未定義であることがわかります。したがって、if 文ブロックが終了した後にインデックス変数が破棄されていることがわかります。 「sum」変数はどうでしょうか?この変数は、foo() 関数セクションの実行後に破棄されます。コメントしたステートメントを削除して再度実行すると、システムがエラーを報告することがわかります。上記の foo() 関数を次のように変更すると、
function foo(flag) { var sum = 0; for(var index=0;index<10;index++) { sum +=index; } document.write("index is :"+index+"<br>"); return sum; }
インデックス値 ("index is :10") が出力できることがわかります。これが js の違いです。他の言語では、インデックスが for ループの {} の外側で定義されているため、そのスコープは foo() 関数の使用後に破棄されます。
クラス変数:
クラス変数は、実際にはクラスの属性、フィールド、またはメソッドです。最初に説明した Student クラスなど、クラスのインスタンス オブジェクトが破棄された後、この変数は自動的に破棄されます。これについてはあまり説明しませんので、ご自身で試してみてください。
プライベート変数:
プライベート変数はクラスによって内部的に使用される属性であり、その定義は var を使用して宣言されます。 var で宣言されていない場合、変数は次のようなグローバル変数 (後で説明します) になることに注意してください:
function Student(name,age,from) { this.name = FormatIt(name); this.age = age; this.from = from; var origName = name; var FormatIt = function(name) { return name.substr(0,5); } this.ToString = function() { return "my information is name: "+origName+",age : "+this.age+", from :" +this.from; } }
ここでは、2 つのプライベート変数、それぞれ origName と FormatIt() を定義しました (オブジェクト指向の解釈では、クラスの属性によって呼び出される必要があります)。
この場合のメソッドも変数と呼びます。この場合の変数は関数型変数であり、関数も Object クラスの継承クラスに属するためです。この場合、var zfp = new Student("3zfp",100,"ShenZhen") と定義するとします。ただし、これら 2 つの変数には、zfp.origName および zfp.FormatIt() を通じてアクセスすることはできません。
以下の点に注意してください:
1. プライベート変数はこれで指定できません。
2. プライベート メソッド型の変数の呼び出しは、メソッドが宣言された後に行う必要があります。たとえば、Student クラスを次のように変換します。
function Student(name,age,from) { var origName = name; this.name = FormatName(name); this.age = age; this.from = from; var FormatName = function(name) { return name+".china"; } this.ToString = function() { return "my information is name: "+origName+",age : "+this.age+", from :" +this.from; } } var zfp = new Student("3zfp",100,"ShenZhen");
コードが実行されると、「オブジェクトが見つかりません」エラーが報告されます。これは、FormatName() が定義されていないことを意味します。
3. 以下のように、プライベート メソッドは this で示される変数 (パブリック変数) にアクセスできません:
function Student(basicinfo) { this.basicInfo = basicinfo; var FormatInfo = function() { this.basicInfo.name = this.basicInfo.name+".china"; } FormatInfo(); } function BasicInfo(name,age,from) { this.name = name; this.age = age; this.from = from; } var zfp = new Student(new BasicInfo("3zfp",100,"ShenZhen"));
コードを実行すると、システムは「this.basicInfo が空であるか、オブジェクトではありません」というエラーを表示します。
基本的な結論は、プライベート メソッドはプライベート プロパティにのみアクセスできるということです。プライベート プロパティは、宣言されて割り当てられた後、クラス内のどこからでもアクセスできます。
静的変数:
静的変数は、クラス名 + このプロパティにアクセスすることで、クラスによって所有されるプロパティです。 「.」+静的変数名を使用します。以下のことを明確に説明できます:
function BasicInfo(name,age,from) { this.name = name; this.age = age; this.from = from; } BasicInfo.generalInfo = "is 3zfp owned object"; var basic = new BasicInfo("zfp",100,"ShenZhen"); document.write(basic.generalInfo+"<br>"); document.write(BasicInfo.generalInfo+"<br>"); BasicInfo.generalInfo = "info is changed"; document.write(BasicInfo.generalInfo+"<br>");
上記のコードを実行すると、次の結果が得られます:
undefined is 3zfp owned object info is changed
次の点に注意してください:
1. 静的変数をクラス名 + の形式で宣言します。 " + 静的変数名 変数
2. 静的変数は、クラスのインスタンス オブジェクトに固有の属性ではなく、オブジェクト間で共有される属性です。
3. インスタンス オブジェクト名 + "." + 静的変数名でアクセスできます。
グローバル変数:
グローバル変数は、システム全体の動作中に効果的なアクセス制御を行う変数です。通常、次のように js コードの先頭で定義されます。
var copyright = "3zfp owned"; var foo =function() { window.alert(copyright); }
次の点に注意してください。変数が var で宣言されていない場合、それはグローバル変数とみなされます。例:
var copyright = "3zfp owned"; var foo =function(fooInfo) { _foo = fooInfo; document.write(copyright+"<br>"); } new foo("foo test"); document.write(_foo+"<br>"); 执行代码,将得到如下结果: 3zfp owned foo test 但是,这个又有一个注意的地方,function是编译期对象,也就是说_foo这个全局变量要在foo对象被实例化后才能被初始化,也就是说如果将 new foo(); document.write(_foo+"<br>"); 对调成 document.write(_foo+"<br>"); new foo(); 系统将提示 "_foo 未定义"。
var copyright = "3zfp owned"; var foo =function(fooInfo) { var copyright = fooInfo; //同名变量 this.showInfo = function() { document.write(copyright+"<br>"); } } new foo("foo test").showInfo(); document.write(copyright+"<br>");
3zfp owned
foo test
Theその理由は、関数がコンパイル中に完了するためです。変数の定義、つまり foo 内の copyright の定義はコンパイル中に完了し、そのスコープは foo オブジェクト内でのみ有効であり、外部で定義されたグローバル変数 copyright とは何の関係もありません。 。
以上がJavaScript の変数型を使用する際のいくつかのテクニックについて説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。