ホームページ  >  記事  >  高品質なJSコードの書き方

高品質なJSコードの書き方

小云云
小云云オリジナル
2018-01-09 09:24:111573ブラウズ

この記事では主に、高品質の JS コードを作成するための 12 の方法を説明します。この利便性が必要な友人は参照してください。このセクションを学習した後、より良い js コードを作成できることを願っています。

高品質の JS コードを作成すると、プログラマーが見やすくなるだけでなく、プログラムの実行速度も向上します。

1. メンテナンス可能なコードの書き方

この時点では、問題を解決する 4 つの方法がまだ頭の中にはっきりと残っています。そうしないと、他のタスクに移るか、一定時間が経過するとバグが発生し、しばらくしてコードを確認すると、次のことが必要になります。

1. 時間をかけて問題を学習し、理解する 2.解決すべき問題コードを理解するのが最善の時期です

特に大規模なプロジェクトや企業の場合、別の問題があります。バグを修正する人はコードを書いた人ではありません (そしてバグを発見した人でもありません)バグを修正した人は同一人物ではありません)。したがって、以前に自分が書いたコードであっても、チームの他のメンバーが書いたコードであっても、コードを理解するのにかかる時間を短縮することが重要です。これは収益 (収益) と開発者の幸福に関わるものです。なぜなら、レガシー コードの保守に何時間も何日も費やすのではなく、新しくエキサイティングなものを構築する必要があるからです。したがって、保守可能なコードを作成することが重要です。一般に、保守可能なコードには次の原則があります:

可読性

一貫性

予測可能性

同じ人によって書かれたように見える

が文書化されている

2グローバル変数の問題

グローバル変数の問題は、JavaScript アプリケーションと Web ページのすべてのコードがこれらのグローバル変数を共有し、それらが同じグローバル名前空間に存在することです。つまり、プログラムの 2 つの異なる部分がグローバル変数を定義する場合です。同じ名前でも機能が異なる場合、名前の競合は避けられません。 Web ページには、ページの開発者によって記述されていないコードが含まれることもよくあります。例:

サードパーティの JavaScript ライブラリ

広告主のスクリプト コード

サードパーティのユーザー追跡および分析スクリプト コード

さまざまなタイプのウィジェット、ロゴ、ボタン

たとえば、サードパーティのスクリプトは A という名前のグローバル変数を定義し、関数内でも A という名前のグローバル変数を定義します。その結果、後の変数によって前の変数が上書きされ、サードパーティのスクリプトが突然無効になります。そしてそれをデバッグするのは困難です。

つまり: 名前空間モードや自動的にすぐに実行される関数など、グローバル変数の使用をできるだけ少なくすることが重要ですが、グローバル変数を最小限に抑えるために最も重要なことは、常に var を使用して変数を宣言することです。

3. var の副作用を忘れてください

暗黙的なグローバル変数と明示的に定義されたグローバル変数の間には小さな違いがあり、それは、delete 演算子を使用して変数を未定義のままにする機能です。詳細は以下の通りです:

varで作成したグローバル変数(関数以外のプログラムで作成したもの)は削除できません。

var を介して作成されていない暗黙的なグローバル変数 (関数内で作成されたかどうかに関係なく) は削除できます。

つまり、暗黙的なグローバル変数は実際にはグローバル変数ではなく、グローバル オブジェクトのプロパティです。属性は delete 演算子で削除できますが、変数は削除できません。具体的なコードは書きません。

4. グローバル オブジェクトにアクセスします

ブラウザでは、window 属性を介してコード内のどこからでもグローバル オブジェクトにアクセスできます (window という名前のローカル変数を宣言するなど、とんでもないことをしない限り)。ただし、他のコンテキストでは、この便利なプロパティは別の名前で呼ばれる場合があります (またはプログラムで使用できない場合もあります)。ハードコーディングされたウィンドウ識別子を使用せずにグローバル オブジェクトにアクセスする必要がある場合は、任意のレベルの関数スコープで次の操作を実行できます:

var global = (function () { return this; }());

5. for ループ

for ループでは、配列をループできます。または 引数や HTMLCollection オブジェクトなどの配列のようなオブジェクトの値です。通常のループ形式は次のとおりです:

// 次善のループ for (var i = 0; i

この形式のループ欠点は、ループするたびに配列の長さを取得する必要があることです。これにより、特に myarray が配列ではなく HTMLCollection オブジェクトである場合に、コードが削減されます。

6. 組み込みプロトタイプを拡張しないでください

コンストラクターのプロトタイプ属性を拡張することは、機能を向上させる非常に強力な方法ですが、場合によっては強力すぎる場合があります。組み込みのコンストラクター プロトタイプ (Object()、Array()、または Function() など) を追加したくなる誘惑にかられますが、コードが予測不能になるため、保守性が大幅に低下します。あなたのコードを使用する他の開発者は、おそらく、あなたが追加したメソッドではなく、組み込みの JavaScript メソッドを使用して継続的に動作することを好むでしょう。さらに、プロトタイプに追加されたプロパティにより、hasOwnProperty 属性が使用されていないときにプロトタイプがループ内に表示される可能性があり、混乱を引き起こす可能性があります。

7. 暗黙的な型変換を避ける

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中如果语句仅一条,花括号是不需要的,但是你还是应该总是使用它们,这会让代码更有持续性和易于更新。

相关推荐:

如何编写高质量JS代码_基础知识

如何编写高质量JS代码(续)_javascript技巧

JSコードを美しく、読みやすくする方法_基礎知識

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。