この記事では、高品質の JS コードを作成するための 12 の方法を説明します。この便利さを必要とする友人は参照してください。
高品質の JS コードを作成すると、プログラマが見やすくなるだけでなく、プログラムの実行速度も向上します。バグが発生した場合、その問題を解決するための 4 つの方法がまだ頭の中にはっきりと残っていることが最善です。そうしないと、他のタスクに移るか、一定時間が経過するとバグが発生し、しばらくしてコードを確認すると、次のことが必要になります。
1. 時間をかけて問題を学習し、理解する 2.解決すべき問題コードを理解するのが最善の時期です 特に大規模なプロジェクトや企業の場合、別の問題があります。バグを修正する人はコードを書いた人ではありません (そしてバグを発見した人でもありません)バグを修正した人は同一人物ではありません)。したがって、以前に自分が書いたコードであっても、チームの他のメンバーが書いたコードであっても、コードを理解するのにかかる時間を短縮することが重要です。これは収益 (収益) と開発者の幸福に関係します。なぜなら、レガシー コードの保守に何時間も何日も費やすのではなく、新しくエキサイティングなものを構築する必要があるからです。したがって、保守可能なコードを作成することが重要です。一般に、保守可能なコードには次の原則があります: 可読性
一貫性
予測可能性
同じ人によって書かれたように見える
記録された
2.グローバル変数
グローバル変数の問題は、JavaScript アプリケーションと Web ページのすべてのコードがこれらのグローバル変数を共有し、それらが同じグローバル名前空間に存在するため、プログラムの 2 つの異なる部分が同じグローバル変数を定義する場合に発生します。名前は同じでも機能が異なる場合、名前の競合は避けられません。 Web ページには、次のような、ページの開発者によって記述されていないコードが含まれることもよくあります。
サードパーティの JavaScript ライブラリ 広告主のスクリプト コード サードパーティのユーザー追跡および分析スクリプト コード
さまざまなウィジェット、ロゴ、ボタンの種類
たとえば、サードパーティのスクリプトは A という名前のグローバル変数を定義し、関数内でも A という名前のグローバル変数を定義します。その結果、後の変数によって前の変数が上書きされ、サードパーティのスクリプトが突然無効になります。そしてそれをデバッグするのは困難です。
つまり: 名前空間モードや自動的にすぐに実行される関数など、グローバル変数の使用をできるだけ少なくすることが重要ですが、グローバル変数を最小限に抑えるために最も重要なことは、常に var を使用して変数を宣言することです。
3. var の副作用を忘れてください
暗黙的なグローバル変数と明示的に定義されたグローバル変数の間には小さな違いがあります。それは、delete 演算子を使用して変数を未定義のままにする機能です。詳細は以下の通りです:
varで作成したグローバル変数(関数以外のプログラムで作成したもの)は削除できません。 var を介して作成されていない暗黙的なグローバル変数 (関数内で作成されたかどうかに関係なく) は削除できます。 つまり、暗黙的なグローバル変数は実際にはグローバル変数ではなく、グローバル オブジェクトのプロパティです。属性は delete 演算子で削除できますが、変数は削除できません。具体的なコードは書きません。
4. グローバル オブジェクトにアクセスする
ブラウザでは、(ローカル変数という名前のウィンドウを宣言するなど、とんでもないことをしない限り) window 属性を介してコード内のどこからでもグローバル オブジェクトにアクセスできます。ただし、他のコンテキストでは、この便利なプロパティは別の名前で呼ばれる場合があります (またはプログラムで使用できない場合もあります)。ハードコーディングされたウィンドウ識別子を使用せずにグローバル オブジェクトにアクセスする必要がある場合は、関数スコープの任意のレベルで次の操作を行うことができます:
var global = (function () { return this; }());
5. for ループ
for ループでは、Loop を実行できます。引数や HTMLCollection オブジェクトなどの配列または配列に似たオブジェクトの値を通じて。通常のループ形式は次のとおりです:
// 次善のループ for (var i = 0; i
6. 組み込みプロトタイプを拡張しないでください
コンストラクターのプロトタイプ属性を拡張することは、機能を向上させる非常に強力な方法ですが、場合によっては強力すぎる場合があります。組み込みのコンストラクター プロトタイプ (Object()、Array()、または Function() など) を追加したくなる誘惑にかられますが、コードが予測不能になるため、保守性が大幅に低下します。あなたのコードを使用する他の開発者は、おそらく、あなたが追加したメソッドではなく、組み込みの JavaScript メソッドを使用して継続的に動作することを好むでしょう。さらに、プロトタイプに追加されたプロパティにより、hasOwnProperty 属性が使用されていないときにプロトタイプがループ内に表示される可能性があり、混乱を引き起こす可能性があります。
七、避免隐式类型转换
JavaScript的变量在比较的时候会隐式类型转换。这就是为什么一些诸如:false == 0 或 “” == 0 返回的结果是true。为避免引起混乱的隐含类型转换,在你比较值和表达式类型的时候始终使用===和!==操作符。
var zero = 0; if (zero === false) { // 不执行,因为zero为0, 而不是false } // 反面示例 if (zero == false) { // 执行了... }
八、避免eval()
如果你现在的代码中使用了eval(),记住该咒语“eval()是魔鬼”。此方法接受任意的字符串,并当作JavaScript代码来处理。当有 问题的代码是事先知道的(不是运行时确定的),没有理由使用eval()。如果代码是在运行时动态生成,有一个更好的方式不使用eval而达到同样的目 标。例如,用方括号表示法来访问动态属性会更好更简单:
// 反面示例 var property = "name"; alert(eval("obj." + property)); // 更好的 var property = "name"; alert(obj[property]);
使用eval()也带来了安全隐患,因为被执行的代码(例如从网络来)可能已被篡改。这是个很常见的反面教材,当处理Ajax请求得到的JSON 相应的时候。在这些情况下,最好使用JavaScript内置方法来解析JSON相应,以确保安全和有效。若浏览器不支持JSON.parse(),你可 以使用来自JSON.org的库。
同样重要的是要记住,给setInterval(), setTimeout()和Function()构造函数传递字符串,大部分情况下,与使用eval()是类似的,因此要避免。在幕后,JavaScript仍需要评估和执行你给程序传递的字符串:
// 反面示例 setTimeout("myFunc()", 1000); setTimeout("myFunc(1, 2, 3)", 1000); // 更好的 setTimeout(myFunc, 1000); setTimeout(function () { myFunc(1, 2, 3); }, 1000);
使用新的Function()构造就类似于eval(),应小心接近。这可能是一个强大的构造,但往往被误用。如果你绝对必须使用eval(),你 可以考虑使用new Function()代替。有一个小的潜在好处,因为在新Function()中作代码评估是在局部函数作用域中运行,所以代码中任何被评估的通过var 定义的变量都不会自动变成全局变量。另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中。
考虑下面这个例子,这里仅un作为全局变量污染了命名空间。
console.log(typeof un); // "undefined" console.log(typeof deux); // "undefined" console.log(typeof trois); // "undefined" var jsstring = "var un = 1; console.log(un);"; eval(jsstring); // logs "1" jsstring = "var deux = 2; console.log(deux);"; new Function(jsstring)(); // logs "2" jsstring = "var trois = 3; console.log(trois);"; (function () { eval(jsstring); }()); // logs "3" console.log(typeof un); // number console.log(typeof deux); // "undefined" console.log(typeof trois); // "undefined"
另一间eval()和Function构造不同的是eval()可以干扰作用域链,而Function()更安分守己些。不管你在哪里执行 Function(),它只看到全局作用域。所以其能很好的避免本地变量污染。在下面这个例子中,eval()可以访问和修改它外部作用域中的变量,这是 Function做不来的(注意到使用Function和new Function是相同的)。
(function () { var local = 1; eval("local = 3; console.log(local)"); // logs "3" console.log(local); // logs "3" }()); (function () { var local = 1; Function("console.log(typeof local);")(); // logs undefined
九、编码规范
建立和遵循编码规范是很重要的,这让你的代码保持一致性,可预测,更易于阅读和理解。一个新的开发者加入这个团队可以通读规范,理解其它团队成员书写的代码,更快上手干活。
十、缩进
代码没有缩进基本上就不能读了。唯一糟糕的事情就是不一致的缩进,因为它看上去像是遵循了规范,但是可能一路上伴随着混乱和惊奇。重要的是规范地使用缩进。
十一、注释
你必须注释你的代码,即使不会有其他人向你一样接触它。通常,当你深入研究一个问题,你会很清楚的知道这个代码是干嘛用的,但是,当你一周之后再回来看的时候,想必也要耗掉不少脑细胞去搞明白到底怎么工作的。
很显然,注释不能走极端:每个单独变量或是单独一行。但是,你通常应该记录所有的函数,它们的参数和返回值,或是任何不寻常的技术和方法。要想到注 释可以给你代码未来的阅读者以诸多提示;阅读者需要的是(不要读太多的东西)仅注释和函数属性名来理解你的代码。例如,当你有五六行程序执行特定的任务, 如果你提供了一行代码目的以及为什么在这里的描述的话,阅读者就可以直接跳过这段细节。没有硬性规定注释代码比,代码的某些部分(如正则表达式)可能注释 要比代码多。
十二、花括号{}
中括弧は、オプションの場合でも常に使用する必要があります。技術的には、in または for にステートメントが 1 つしかない場合は中括弧は必要ありませんが、コードの一貫性が高まり、更新が容易になります。
上記は私があなたのためにまとめたものです。
関連記事:
webpack-dev-serverでhttp-proxyを使う方法(詳細チュートリアル)
vuejsで再帰ツリーメニューコンポーネントを実装する方法(詳細なチュートリアル)
以上が高品質の JS コードを記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。