プログラミング コードを記述するときは、開発者によって意見が異なります。ただし、常に参照することは良いことです。ここでは、JavaScript Toolbox からの 14 の最高の JS コーディングのヒントを紹介します。
1. 常に var
を使用します。
JavaScript では、変数はグローバル スコープまたは関数スコープのいずれかになります。変数を簡潔かつ明確に保つには、var キーワードを使用することが重要です。グローバルまたは関数レベルの変数を宣言する場合は、常に var キーワードを先頭に追加してください。次の例では、これを行わない場合の潜在的な問題を示します。
Var を使用しないことによって引き起こされる問題
var i=0; // This is good - creates a global variable function test() { for (i=0; i<10; i++) { alert("Hello World!"); } } test(); alert(i); // The global variable i is now 10!
変数関数の変数 i は関数レベルの変数にするために var を使用していないため、この例ではグローバル変数を参照しています。グローバル変数を宣言するには常に var を使用するのが一般的ですが、関数スコープ変数を定義するには var を使用することが重要です。次の 2 つのメソッドは機能的に同等です:
正しい関数
function test() { var i=0; for (i=0; i10; i++) { alert("Hello World!"); } }
正しい関数
function test() { for (var i=0; i10; i++) { alert("Hello World!"); } }
2. ブラウザー検出の代わりに機能検出
一部のコードは、ブラウザのバージョンを検出し、ユーザーが使用しているクライアントに基づいてさまざまなアクションを実行するために記述されています。一般に、これは非常に悪い習慣です。より良い方法は、機能検出を使用することです。古いブラウザーがサポートしていない高度な機能を使用する前に、まず (ブラウザーに) その機能があるかどうかを確認してから、それを使用します。ブラウザの機能がわかっている場合でも、ブラウザのバージョンのみを検出することをお勧めします。この問題について詳しく説明した記事はここにあります。
例:
if (document.getElementById) { var element = document.getElementById('MyId'); } else { alert('Your browser lacks the capabilities required to run this script!'); }
3. 角括弧表記
を使用します。アクセスが実行時に決定される場合、または . シンボルを使用してアクセスできないオブジェクト プロパティが含まれる場合は、角かっこ表記を使用します。経験豊富な Javascript プログラマでない場合は、常に角括弧を使用することをお勧めします。
オブジェクトのプロパティには、. 表記と [ ] 角括弧表記という 2 つの固定方法でアクセスします。
.表記
MyObject.property
[ ] 角括弧表記
MyObject["プロパティ"]
. 記号を使用します。属性名はハードコードであり、実行中に変更できません。 [ ] 角括弧を使用すると、プロパティ名はプロパティ名から計算された文字列になります。文字列はハード コードである場合もあれば、変数である場合もあり、文字列値をコールバックする関数である場合もあります。 実行中に属性名が生成される場合、value1''、value2''、value3'' のような属性があり、変数 i=2 を使用して
にアクセスする場合は角括弧が必要です。これは機能します:
MyObject["value" i]
これは許可されません:
MyObject.value i
一部のサーバー側環境 (PHP、Struts など) では、サーバー側でフォーム フォームを配列として扱う必要があることを示すために、フォーム フォームに [ ] 番号が追加されます。この場合、[ ] は Javascript 配列を参照するための構文であるため、. 記号を使用して記号 [ ] を含むフィールドを参照することはできません。したがって、[ ] 表記が必要です:
これは機能します:
formref.elements["name[]"]
これは許可されません:
formref.elements.name[]
[ ] 角括弧表記の推奨される使用法は、(明らかに) 必要な場合に常に使用されることを意味します。それを使用する厳密な必要性がない場合、それは個人的な好みと習慣の問題です。経験則として、標準のオブジェクト プロパティにアクセスするには . 表記を使用し、ページ定義のオブジェクト プロパティにアクセスするには [ ] 角括弧表記を使用します。したがって、 document["getElementById"]() は [ ] 角括弧表記の完全に有効な使用方法ですが、 getElementById は DOM 仕様で定義されている標準のドキュメント オブジェクト プロパティであるため、構文的には document.getElementById() の方が優先されます。これら 2 つの表記を混合すると、コード内でどれが標準のオブジェクト プロパティであり、どのプロパティ名がコンテキストによって定義されているかが明確になります。
document.forms["myformname"].elements["myinput"].valueここで、forms はドキュメントの標準属性であり、フォーム名 myformname はページによって定義されます。同時に、要素と値属性は仕様で定義された標準属性です。そして、myinput はページによって定義されます。このページの構文は (コードの内容を) 非常に理解しやすくするため、従うことをお勧めしますが、厳密な原則ではありません。
4. eval を避ける
Javascriptにおいて、eval()関数は実行中に任意のコードを実行するメソッドです。ほとんどの場合、eval は使用すべきではありません。それがあなたのページにある場合は、あなたがしていることを行うためのより良い方法があります。一例として、eval は角括弧表記の使用方法を知らないプログラマによってよく使用されます。原則として、Eval は悪です (Eval は悪魔です)。経験豊富な開発者であり、自分の状況が例外であることを理解している場合を除き、これを使用しないでください。
5. フォームとフォーム要素を正しく参照する
すべての html フォームには name 属性が必要です。 XHTML ドキュメントの場合、name 属性は必要ありませんが、Form タグには対応する id 属性が必要であり、document.getElementById() を使用して参照する必要があります。 document.forms[0] のようなインデックス メソッドを使用してフォームを参照することは、ほとんどの場合、悪い習慣です。一部のブラウザでは、form という名前のドキュメント内の要素を使用可能なフォーム属性として扱います。これは信頼性が低いため、使用しないでください。次の例は、角かっこと正しいオブジェクト参照方法を使用して、フォーム入力への誤った参照を防ぐ方法を示しています。
フォーム入力を正しく引用します:
document.forms["フォーム名"].elements["入力名"]
悪いアプローチ:
ドキュメント.フォーム名.入力名
関数内で 2 つのフォーム要素を参照したい場合は、最初にフォーム オブジェクトを参照して、それを変数に格納する方が良い方法です。これにより、フォームへの参照を解決するためにクエリを繰り返す必要がなくなります:
onChange または他の同様のイベント処理メソッドを使用する場合、常に関数への参照を通じて入力要素自体を参照することをお勧めします。すべての入力要素には、それを含むフォームへの参照が含まれます:
関数 validate(input_obj) {
//この要素を含むフォーム
を参照します
var theform = input_obj.form;
// ハードコードを使用せずにフォーム自体を参照できるようになりました
if (theform.elements["city"].value=="") {
alert("エラー");
}
}
form 要素を参照してフォームのプロパティにアクセスするには、このページ上の特定の名前を持つフォームを参照するハード コードを含まない関数を作成できます。関数が再利用可能になるため、これは非常に良い習慣です。
6
で回避JavaScript の with ステートメントはスコープの先頭にオブジェクトを挿入するため、プロパティ/変数の参照は最初にオブジェクトに対して解決されます。これは、繰り返しの参照を避けるためのショートカットとしてよく使用されます:
使用例:
しかし、問題は、input1 または input2 が実際に Form 要素配列の属性として扱われたかどうかをプログラマが検証する方法がないことです。まず、それらの名前でプロパティをチェックし、見つからない場合はスコープを (下に) 進めます。最後に、input1 と input2 をグローバル オブジェクト内の 1 つのグローバル オブジェクトとして処理しようとしますが、エラーが発生します。
回避策は、参照を作成して参照されるオブジェクトを減らし、それを使用してこれらの参照を解決することです。
参照を使用します:
7. アンカー内で JavaScript の代わりに onclick を使用します: 擬似プロトコル
タグ内で Javascript コードをトリガーしたい場合は、JavaScript: pseudo-protocol の代わりに onclick を選択します。onclick を使用して実行される Javascript コードは true または false (または evalues よりも true または false を返す式) を返す必要があります。翻訳する必要がありますか? これは私が理解している方法です: true または false よりも優先度の高い式]) タグ自体を返します: true が返された場合、false が返された場合、アンカーの href は一般リンクとして扱われます。返された場合、href は無視されます。このため、onclick によって処理されるコードの最後に return false; が含まれることがよくあります。
正しい構文:
a href="javascript_required.html"go/a
この例では、クリックされると doSomething() 関数 (ページの隅に定義されています) が呼び出されます。 Javascript が有効になっているブラウザでは、href にアクセスすることはできません。ドキュメント javascript_required.html は、JavaScript が必要であるがユーザーが有効にしていないことを警告できるブラウザにのみロードされます。通常、ユーザーが Javascript サポートを有効にしていることを確認する場合、物事をシンプルにするために、リンクには href=# のみが含まれます。 この習慣は推奨されません。通常、JavaScript を有効にせずにローカルに戻るページを提供することをお勧めします。
場合によっては、多くの人が状況に応じてリンクにアクセスしたいことがあります。たとえば、ユーザーがフォーム ページの 1 つから離れようとしていて、何も変更されていないことを確認するために最初に検証したい場合です。この場合、onclick はリンクをたどるべきかどうかのクエリを返す関数にアクセスします:
条件付きリンク アクセス:
関数 validate() {
returnプロンプト("このページを終了してもよろしいですか?");
}
在这个实例中,validate() 函数必须只返回 ture 或 false。ture 的时候用户将被允许问题 home 页面,或 false 的时候链接不被访问。这个例子提示确认(其行为),以访问 ture 或 false,这完全由用户点击确实或者取消决定。
下面是一些不应该的例子。如果你在自己的页面中看到下面这样的代码,这是不正确的,需要被修改:
什么是不应该做的:
8. 使用一元 + 号运算符使类型转向Number
在Javascript中,+号运算符同时充当数学加号和连接符。这会在form表单的域值相加时出现问题,例如,因为Javascript是 一个弱类型语言,form 域的值将会被当作数组来处理,而你把它们+一起的时候,+将被当成连接符,而非数学加号。
有问题的例子:
form name="myform" action="[url]" input type="text" name="val1" value="1" input type="text" name="val2" value="2" /form function total() { var theform = document.forms["myform"]; var total = theform.elements["val1"].value + theform.elements["val2"].value; alert(total); // 这个将会弹出 "12", 但你想要的是 3! }
解决这个问题,Javascript 需要一个提示来让它把这些值当做数字来处理。你可以使用+号来把数组转换成数字。给变量或者表达式前置一个+号将会强制其当作一个数字来处理,而这也将使得数学+得以成功应用。
修改好的代码:
function total() { var theform = document.forms["myform"]; var total = (+theform.elements["val1"].value) + (+theform.elements["val2"].value); alert(total); // This will alert 3 }
9. 避免 document.all
document.all 是由Microsoft 的 IE 所引进的,并不是一个标准的 Javascript DOM 特性。尽管大多数新的浏览器支持它以支持依赖于它的糟糕代码,(而)还有很多浏览器是不支持的。
并没有理由其他方法都不适用,而一个老的IE浏览器(5.0)需要支持,而在Javascript中使用 document.all 作为一个折衷方法。 你并不需要使用 document.all 来检测其是不是IE浏览器,因为其他浏览器现在一般都支持。
只把 document.all 当做最后的选择:
if (document.getElementById) { var obj = document.getElementById("myId"); } else if (document.all) { var obj = document.all("myId"); }
一些使用 document.all 的原则:
•同尝试其他方法
•当其作为最后的选择
•当需要支持 5.0 版本以下的 IE 浏览器
•总是使用 if (document.all) { } 来查看是否支持.
10. 不要在脚本代码块中使用HTML注释
在 Javascript 的旧日子(1995)里,诸如 Netscape 1.0 的一些浏览器并不支持或认识 script 标签。所以,当 Javascript 第一次被发布,需要有一个技术来让实些代码不被当做文本显示于旧版浏览器上。有一个hack 是在代码中使用 HTML 注释来隐藏这些代码。
使 HTML 注释并不好:
script language="javascript" !-- // code here //-- /script
在今天,没有任何一个常用的浏览器会忽略掉 script 标签。因此,再没必要隐藏 Javascript 源代码。事实上,它还可以因为下面的理由,被认为是无益的:
•在 XHTML 文档中,源代码将向所有浏览器隐藏并被渲染成无用的(内容);
•– 在 HTML 注释并不允许 ,这个会让任何递减操作将失效。
11. 避免乱用全局命名空间
一般很少需要全部变量和函数。全局使用将可能导致 Javascript 源文件文档冲突,和代码中止。因此,一个好的做法是在一个全局命名空间内采用函数性的封装。有多个方法可以完成这个任务,有此相对比较复杂。最简单的方法 是创建一个全局对象,并把属性和方法指派给这个对象:
创建一个命名空间:
var MyLib = {}; // global Object cointainer MyLib.value = 1; MyLib.increment = function() { MyLib.value++; } MyLib.show = function() { alert(MyLib.value); } MyLib.value=6; MyLib.increment(); MyLib.show(); // alerts 7
命名空间也可以使用 Closures(闭包?) 来创建,并且 Private Member Variables (私有变量?) 也可以伪装于 Javascript中。
12. 避免同步的 ajax 调用
当使用Ajax请求时,你要么选择异步模式,要么使用同步模式。当浏览器行为可以继续执行,异步模式将请求放在后台执行,同步模式则会等待请求完成后才继续。
应该避免同步模式做出的请求。这些请求将会对用户禁用浏览器,直至请求返回。一旦服务器忙,并需要一段时间来完成请求,用户的浏览器(或者 OS)将不能做任何其他的事,直至请求超时。
如果你觉得自己的情况需要同步模式,最大的可能是你需要时间来重新想一下你的设计。很少(如果有的话)实际上需要同步模式的 Ajax 请求。
13. 使用 JSON
当需要将数据结构存储成纯文本,或者通过 Ajax 发送/取回数据结构,尽可能使用 JSON 代替 XML。JSON (JavaScript Object Notation) 是一个更简洁有效的数据存储格式,并且不依赖任何语言(and is a language-neutral)。
14. 使用正确的 script 标签
不造成在 script 中的使用LANGUAGE 属性。一个合适的方式是创建如下的 Javascript 代码块:
<script type="text/javascript"> // code here </script>