ホームページ >ウェブフロントエンド >jsチュートリアル >JS_javascript スキルにおける変数の優れた詳細な分析
ここでは Javascript の変数に関する私の理解を詳しく説明します。不適切な点があればコメントしてください。
1. 変数の型
Javascript は Java や C などの言語とは異なり、型付けがなく、検出が弱い言語です。変数の定義には変数の型を宣言する必要はありません。代入を通じてさまざまな型のデータを同じ変数に割り当てることができます。例:
i=100;//数値型
i="variable";//文字列型
i={x:4};//オブジェクト型
i=[1,2,3];//配列型
JS のこの機能によりコーディングがより柔軟になりますが、デバッグやコンパイラの脆弱な検出に役立たないという欠点ももたらします。長いコードを維持するのは非常に苦痛です。
2. 変数の宣言
JS における変数の宣言は、明示的宣言と暗黙的宣言に分けられます。
var i=100;//明示的な宣言
i=100;//暗黙的な宣言
変数を明示的に宣言するには関数内でvarキーワードを使用しますvar キーワードを使用する代わりに、直接代入を使用して宣言されたグローバル変数です。
宣言されていない変数にアクセスすると、JS はエラーを報告します。宣言されていない変数に値を代入すると、JS はエラーを報告しません。逆に、暗黙的にグローバル変数を宣言したいと考えるため、注意が必要です。
3. グローバル変数とローカル変数
JS パーサーが実行されると、まず実行環境にグローバル オブジェクトが構築されます。これは、オブジェクトのプロパティです。 、トップレベルのコードでは、 this キーワードと window オブジェクトを使用してアクセスできます。関数本体内のローカル変数は、関数の実行時に生成される呼び出しオブジェクト内にのみ存在します。ローカル変数は、関数が実行されるとすぐに破棄されます。したがって、プログラミングでは、変数を合理的に宣言する方法を考慮する必要があります。これにより、不要なメモリのオーバーヘッドが削減されるだけでなく、変数の繰り返し定義や以前に定義された変数の上書きによって引き起こされるデバッグの問題が大幅に回避されます。
4. 変数のスコープ
変数のスコープは、どのプログラミング言語においても重要な詳細です。 JS の変数のスコープは JAVA や C などの言語に比べて比較的自由です。大きな特徴は、JS 変数にはブロックレベルのスコープが存在しないことです。関数内の変数は Run 関数全体で有効です。次のコード:
出力結果は 0 1 0 です。上記のことから、JS が var を使用して関数内で変数を宣言すると、 body の場合、この変数は関数本体内でのみ有効です。関数が終了すると、ローカル変数は破棄できます。
上記の JS 機能により、注意が必要な別の重要な問題があります。 ActionScript は以前にも使用されましたが、ActionScript と JS はどちらも ECMA 標準に基づいていますが、ここでは少し異なります。たとえば、次のコード:
出力結果は 0 0 1 0 だと思うかもしれません。実際、これは AS の場合に当てはまりますが、AS の入力はJS は 0 未定義 1 0 ですが、なぜこのようなことが起こるのでしょうか? JS 関数本体で宣言されたローカル変数は関数全体で有効であると述べましたが、実際には、明示的に宣言された変数 i は内部関数で有効になります。暗黙的に宣言された変数とは異なり、解釈時にグローバル変数として定義されますが、この時点ではローカル変数 i は未割り当ての変数です。未定義の変数があるため、未定義が出力されます。上記のコードは次のコードと同等です。
function inner(){
var i; // 値を定義しますが割り当てません
outPut(i); // undefiend
i =1;
outPut(i); //1
}
上記の問題を回避するには、関数の先頭で関数宣言を行うことを強くお勧めします。
5. 基本型と参照型
JavaやCなどの言語とは異なり、JSは変数宣言時に変数の格納領域を宣言する必要がありません。変数に格納されるデータは、基本型と参照型の 2 つのカテゴリに分類できます。このうち、数値、ブール値、null、未定義は基本型であり、オブジェクト、配列、関数は参照型です。
基本型はメモリ内に固定メモリ サイズを持ちます。例: 数値型はメモリ内で 8 バイトを占有しますが、ブール値は 1 バイトのみを占有します。参照データの場合、任意の長さを指定できるため、メモリ サイズは可変です。そのため、変数に格納されるのは実際にはデータへの参照 (通常はメモリ アドレスまたはポインタ) であり、これを通じてデータを見つけることができます。
参照型と基本型の間には使用動作にも違いがあります。
基本型 b に値を代入するとき、実際には別の領域が開かれます。メモリ空間に依存するため、変数 a の値を変更しても変数 b には影響しません。
<script> <BR>//定义一个输出函数 <BR>function outPut(s){ <BR>document.writeln(s) <BR>} <BR>//全局变量 <BR>var i=0; <BR>//定义外部函数 <BR>function outer(){ <BR>//访问全局变量 <BR>outPut(i); // 0 <BR>//定义一个类部函数 <BR>function inner(){ <BR>//定义局部变量 <BR>var i = 1; <BR>// i=1; 如果用隐式申明 那么就覆盖了全局变量i <BR>outPut(i); //1 <BR>} <BR>inner(); <BR>outPut(i); //0 <BR>} <BR>outer(); <BR></script> <script> <BR>//定义一个输出函数 <BR>function outPut(s){ <BR>document.writeln(s) <BR>} <BR>//全局变量 <BR>var i=0; <BR>//定义外部函数 <BR>function outer(){ <BR>//访问全局变量 <BR>outPut(i); // 0 <BR>//定义一个类部函数 <BR>function inner(){ <BR>outPut(i); //undefiend <BR>var i=1; <BR>outPut(i); //1 <BR>} <BR>inner(); <BR>outPut(i); //0 <BR>} <BR>outer(); <BR></script><script> <BR>//定义一个输出函数 <BR>function outPut(s){ <BR>document.writeln(s) <BR>} <BR>var a = 3; <BR>var b = a; <BR>outPut(b); <BR>//3 <BR>a = 4; <BR>outPut(a); <BR>//4 <BR>outPut(b); <BR>//3 <BR></script><script> <BR>//定义一个输出函数 <BR>function outPut(s){ <BR>document.writeln(s) <BR>} <BR>var a_array = [1,2,3]; <BR>var b_array = a_array; <BR>outPut(b_array); //1,2,3 <BR>a_array[3] = 4; <BR>outPut(b_array);//1,2,3,4 <BR></script> 実際、これらは参照型をメモリ アドレスに渡すため、 a_array と b_array にアクセスします。実際、それらはすべて同じメモリ領域で動作します。参照変数を保存するためにメモリ領域を再割り当てする場合は、クローン作成メソッドまたはカスタム メソッドを使用して参照変数のデータをコピーする必要があります。