JavaScriptによくあるエラー
13663 ワード
JavaScriptに接触して2年以上の間に様々なエラーが発生しました.中には防げないものがあります.もともとJavaScriptに対する誤解はこのように深いです.この文でよく見られる様々な考えをまとめてみます.
String replace
stringのreplace方法はよく使われています.stringの中のいくつかの文字を置き換えると、文法はこのようになります.
デートオブジェクト
このようにしてDateオブジェクトを作成することができます.
Date.parse方法は、2つのフォーマットの文字列パラメータを識別することができます.
1.「M/d/yyy」:米国の日付表示形式.年に2位に入ると19 xxとして扱います.
2.「yyy-M-dd」または「yyyy/MM/dd」:月と日は必ず二人であることに注意してください.
Date.parseの戻り値は、Dateオブジェクトではなく、1970-01-01真夜中(GMT)から所与の日付までのミリ秒数である.Dateの構造関数でDateオブジェクトに変換できます.
for...inは、オブジェクト中のメンバー(属性、方法)を遍歴するために使用されます.配列を巡回するために使用される結果が、予期される配列ごとの値ではなく、方法などが遍歴されます.
parseInt
文法:parseInt(string、radix)
パラメータ
説明
ストリングス
必要です.解析する文字列.
ラジクス
オプション.解析する数値の基数を表します.この値は2~36の間にあります.このパラメータが省略されているか、またはその値が0である場合、数字は10をもとに解析されます.「0 x」または「0 X」で始まると、16を基数とします.このパラメータが2以下であるか36以上である場合、パー秒Int()はNaNに戻る.
パラメータradixの値が0である場合や、このパラメータが設定されていない場合は、パー秒Int()は、stringによって数字の基数を判断します.
例えば、string(先頭の最後のスペースは自動的に省略されている)が「0 x」で始まると、パーrseInt()は、stringの残りの部分を16進数の整数に解析する.stringが0で始まると、ECMAScript v 3は、その後の文字を8進数または16進数に解析するためのパースInt()の1つの実装を可能にする.stringが1~9の数字で始まると、パー秒Int()はそれを10進数の整数に解析します.文字列の最初の文字が数字に変換されない場合、パーパーミッション()はNaNに戻ります.
set Timeout()とset Interval()は、しばしば遅延とタイミングタスクを処理するために用いられる.setTimeout()メソッドは、指定されたミリ秒数後に関数または計算式を呼び出すために使用され、setInterval()は、指定されたミリ秒毎に関数または式を呼び出すことができ、clearIntervalがそれをクリアするまでループします.
JavaScriptは実際には単一スレッドの環境で実行されています.これはタイマーが計画コードだけを未来のある時間に実行することを意味します.具体的に実行するタイミングは保証できません.ページのライフサイクルにおいて、他のコードがJavaScriptプロセスを制御している可能性があります.ページのダウンロードが完了した後にコードの運行、イベントの処理プログラム、Ajaxコールバック関数はすべて同じスレッドを使っています.実際にブラウザは順序付けを行います.あるプログラムをある時点で実行する優先度を割り当てます.
私たちはJavaScriptを時間のオンラインで運行すると想像できます.ページを読み込むときは、まずページライフサイクルの後に使用する方法と変数宣言とデータ処理を行います.その後、JavaScriptプロセスはより多くのコードの実行を待ちます.プロセスが空きましたら、次のコードがトリガされます.
メインJavaScriptプロセスに加えて、次のプロセスの空き時間に実行するコード列が必要です.ページライフサイクルが変化すると、コードは実行順にキューに追加されます.例えば、ボタンが押されると、イベントハンドラはキューに追加され、次の可能な時間で実行されます.あるAjax応答を受信すると、コールバック関数のコードがキューに追加されます.JavaScriptにはコードがありません.直ちに実行されますが、空きがあれば速やかに実行します.タイマーがキューに対して動作する方法は、特定の時間が過ぎたらコードを挿入するという意味ではなく、すぐ実行するという意味ではなく、できるだけ早く実行するということです.
setTimeout/set Interval実行タイミングについて詳細には、setTimeout()とset Interval()がいつ呼び出されますか?
前解析
すなわち、JavaScript値は最初の文を実行する前に関数/変数宣言を前処理しました.var b="Test"は二つの文に相当します.var b;(undefined結果のソースは、第一文を実行する前に解析されました)、b="Test"(この文は順番に実行され、第二文の後に実行されます).これもなぜですか?私たちは方法のステートメントの前に方法を呼び出すことができます.
JavaScriptはブロックレベルのスコープがなく、関数レベルのスコープだけがあります.これはJavaScriptでは文法ブロックの役割を果たすだけで、スコープの役割を果たすことができないことを意味します.
包みを閉じる
まず一つの経典ミスから話します.ページにはいくつかのdivがあります.私達はそれらにオンロック方法を結びつけたいです.そこで次のコードがあります.
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数であり、クローズドを作成する一般的な方法は、関数の内部に別の関数を作成することであり、内部関数を呼び出す可能性がある限り、JavaScriptは参照された関数を保持する必要があります.また、JavaScriptの実行時には、この内部関数のすべての変数を追跡して参照する必要があります.最後の変数が廃棄されるまで、JavaScriptのゴミ収集器は対応するメモリ空間を解放することができます.
この本の内容は浅いので、クローズドを簡単に知りたいです.JavaScriptが閉じているものは何ですか?
終了
JavaScriptについては穴のくぼみが本当に多いです.勉強しながらまとめましょう.
String replace
stringのreplace方法はよく使われています.stringの中のいくつかの文字を置き換えると、文法はこのようになります.
string.replace(subStr/reg,replaceStr/function)
最初のパラメータは検索する文字列または正規表現で、2番目のパラメータは置換したい文字列または方法です.このように使用できます."I'm Byron".replace("B","b") // I'm byron
私たちと同じ考えですが、覚えています."I'm a student, and you?".replace("n","N"); // I'm a studeNt, and you?
私たちが予想していたのと違って、第二の‘n’は取り替えられませんでした.文字列のreplace方法は、最初のパラメータが文字列に入ってくると、最初のマッチのみが置換されます.すべてのマッチ項目を置換するには、RegExpオブジェクトを入力してglobal属性を指定する必要があります."I'm a student, and you?".replace(/n/g,"N"); // I'm a studeNt, aNd you?
このようにやっと私達の目的を達成することができて、string replace方法に関して詳しく使ってJavaScript stringのreplaceを見てみることができます.デートオブジェクト
このようにしてDateオブジェクトを作成することができます.
new Date() //Date {Fri Aug 02 2013 16:50:33 GMT+0800 (China Standard Time)}
new Date(milliseconds) //Date {Fri Aug 02 2013 16:53:26 GMT+0800 (China Standard Time)}
new Date("2013/08/02") //Date {Fri Aug 02 2013 00:00:00 GMT+0800 (China Standard Time)}
new Date(year,month,day,hours,minutes,seconds,ms)
前の3つの方法は問題ないですが、第4の方法で得られた結果はラウンドで予想されたものと一致しませんでした.new Date(2013,08,02) //Date {Mon Sep 02 2013 00:00:00 GMT+0800 (China Standard Time)}
入ってきた月は08で、帰ってきたのは9月だったと見られます.これは、Date対象の月は0から数え始めます.つまり0は1月、1は2月、11は12月を表します.Dateのインスタンスのget Monthメソッドを呼び出すときは特に注意してください.var d = new Date(2012, 4, 15); // 2012 5 15
alert(d.getMonth()); // 4
Date.parseDate.parse方法は、2つのフォーマットの文字列パラメータを識別することができます.
1.「M/d/yyy」:米国の日付表示形式.年に2位に入ると19 xxとして扱います.
2.「yyy-M-dd」または「yyyy/MM/dd」:月と日は必ず二人であることに注意してください.
Date.parseの戻り値は、Dateオブジェクトではなく、1970-01-01真夜中(GMT)から所与の日付までのミリ秒数である.Dateの構造関数でDateオブジェクトに変換できます.
new Date(Date.parse("8/2/2012")); // 2012 8 2
new Date(Date.parse("2012-08-02")); // 2012 8 2
new Date(Date.parse("2012-8-2")); //
for...inは配列を巡回します.for...inは、オブジェクト中のメンバー(属性、方法)を遍歴するために使用されます.配列を巡回するために使用される結果が、予期される配列ごとの値ではなく、方法などが遍歴されます.
Array.prototype.contains = function(item) {
for (var i = 0; i <= this.length - 1; i++) {
if(this[i] == item)
return this[i];
}
}
var staff = [ "Staff A", "Staff B" ];
// Normal Enumeration: Only the 2 items are enumerated
for (var i = 0; i <= staff.length - 1; i++) {
var singleStaff = staff[i];
alert(singleStaff);
}
// for...in Enumeration: the method "contains" are enumerated, too
for (var singleStaff in staff) {
alert(singleStaff);
}
実は私たちは配列に他の属性を加えることが多いです.例えばjQueryオブジェクトは行列オブジェクトにいくつかの拡張方法を加えることです.また、例えば、String.prototype.match方法の戻り値は、配列(正規表現とそのサブ表現のマッチング項目)にindexとinputの2つの属性を加えたものです.parseInt
文法:parseInt(string、radix)
パラメータ
説明
ストリングス
必要です.解析する文字列.
ラジクス
オプション.解析する数値の基数を表します.この値は2~36の間にあります.このパラメータが省略されているか、またはその値が0である場合、数字は10をもとに解析されます.「0 x」または「0 X」で始まると、16を基数とします.このパラメータが2以下であるか36以上である場合、パー秒Int()はNaNに戻る.
パラメータradixの値が0である場合や、このパラメータが設定されていない場合は、パー秒Int()は、stringによって数字の基数を判断します.
例えば、string(先頭の最後のスペースは自動的に省略されている)が「0 x」で始まると、パーrseInt()は、stringの残りの部分を16進数の整数に解析する.stringが0で始まると、ECMAScript v 3は、その後の文字を8進数または16進数に解析するためのパースInt()の1つの実装を可能にする.stringが1~9の数字で始まると、パー秒Int()はそれを10進数の整数に解析します.文字列の最初の文字が数字に変換されない場合、パーパーミッション()はNaNに戻ります.
parseInt("10"); // 10
parseInt("19",10); // 19 (10+9)
parseInt("11",2); // 3 (2+1)
parseInt("17",8); // 15 (8+7)
parseInt("1f",16); // 31 (16+15)
parseInt("010"); // : 10 8
set Timeout/set Interval実行タイミングset Timeout()とset Interval()は、しばしば遅延とタイミングタスクを処理するために用いられる.setTimeout()メソッドは、指定されたミリ秒数後に関数または計算式を呼び出すために使用され、setInterval()は、指定されたミリ秒毎に関数または式を呼び出すことができ、clearIntervalがそれをクリアするまでループします.
JavaScriptは実際には単一スレッドの環境で実行されています.これはタイマーが計画コードだけを未来のある時間に実行することを意味します.具体的に実行するタイミングは保証できません.ページのライフサイクルにおいて、他のコードがJavaScriptプロセスを制御している可能性があります.ページのダウンロードが完了した後にコードの運行、イベントの処理プログラム、Ajaxコールバック関数はすべて同じスレッドを使っています.実際にブラウザは順序付けを行います.あるプログラムをある時点で実行する優先度を割り当てます.
私たちはJavaScriptを時間のオンラインで運行すると想像できます.ページを読み込むときは、まずページライフサイクルの後に使用する方法と変数宣言とデータ処理を行います.その後、JavaScriptプロセスはより多くのコードの実行を待ちます.プロセスが空きましたら、次のコードがトリガされます.
メインJavaScriptプロセスに加えて、次のプロセスの空き時間に実行するコード列が必要です.ページライフサイクルが変化すると、コードは実行順にキューに追加されます.例えば、ボタンが押されると、イベントハンドラはキューに追加され、次の可能な時間で実行されます.あるAjax応答を受信すると、コールバック関数のコードがキューに追加されます.JavaScriptにはコードがありません.直ちに実行されますが、空きがあれば速やかに実行します.タイマーがキューに対して動作する方法は、特定の時間が過ぎたらコードを挿入するという意味ではなく、すぐ実行するという意味ではなく、できるだけ早く実行するということです.
setTimeout/set Interval実行タイミングについて詳細には、setTimeout()とset Interval()がいつ呼び出されますか?
前解析
console.log(a); //Error:a is not defined , , ,
console.log(b) //undefined
var b="Test";
console.log(b);//Test
非常に奇妙な前の2つの変数a、bはすべて声明がなくて、第1文は間違いを報告して、第2文はundefinedを出力することができますか?これはJavaScriptが解釈型言語であるためであるが、直接に逐次実行するものではなく、JavaScript解析プロセスは前後の二つの段階に分けられ、一つは前処理段階であり、もう一つは実行段階である.前処理段階のJavaScript解釈器では、JavaScriptスクリプトコードをバイトコードに変換した後、第二段階のJavaScript解釈器は、実行環境を介して、バイトコードを機械コードに生成し、順次実行します.すなわち、JavaScript値は最初の文を実行する前に関数/変数宣言を前処理しました.var b="Test"は二つの文に相当します.var b;(undefined結果のソースは、第一文を実行する前に解析されました)、b="Test"(この文は順番に実行され、第二文の後に実行されます).これもなぜですか?私たちは方法のステートメントの前に方法を呼び出すことができます.
showMsg(); // This is message
function showMsg()
{
alert('This is message');
}
ブロックレベルのスコープJavaScriptはブロックレベルのスコープがなく、関数レベルのスコープだけがあります.これはJavaScriptでは文法ブロックの役割を果たすだけで、スコープの役割を果たすことができないことを意味します.
if(true){// , {} if
//...
var a=3;
}
console.log(a); //3
上記の例では、windowに属するconsolone.log方法は依然としてローカル変数のようなaにアクセスできることが明らかになっている.包みを閉じる
まず一つの経典ミスから話します.ページにはいくつかのdivがあります.私達はそれらにオンロック方法を結びつけたいです.そこで次のコードがあります.
<div id="divTest">
<span>0</span> <span>1</span> <span>2</span> <span>3</span>
</div>
<div id="divTest2">
<span>0</span> <span>1</span> <span>2</span> <span>3</span>
</div>
$(document).ready(function() {
var spans = $("#divTest span");
for (var i = 0; i < spans.length; i++) {
spans[i].onclick = function() {
alert(i);
}
}
});
とても簡単な機能ですが、どうしても間違えました.毎回alertが出す値は全部4です.簡単な修正が効きます.var spans2 = $("#divTest2 span");
$(document).ready(function() {
for (var i = 0; i < spans2.length; i++) {
(function(num) {
spans2[i].onclick = function() {
alert(num);
}
})(i);
}
});
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数であり、クローズドを作成する一般的な方法は、関数の内部に別の関数を作成することであり、内部関数を呼び出す可能性がある限り、JavaScriptは参照された関数を保持する必要があります.また、JavaScriptの実行時には、この内部関数のすべての変数を追跡して参照する必要があります.最後の変数が廃棄されるまで、JavaScriptのゴミ収集器は対応するメモリ空間を解放することができます.
この本の内容は浅いので、クローズドを簡単に知りたいです.JavaScriptが閉じているものは何ですか?
終了
JavaScriptについては穴のくぼみが本当に多いです.勉強しながらまとめましょう.