ホームページ > 記事 > ウェブフロントエンド > JavaScript_javascript スキルにおける関数の複数の理解について話す
JavaScript の関数には複数の意味があります。 は、オブジェクト テンプレートの役割を果たすコンストラクター ( コンストラクター) である場合があります。 は、オブジェクトへのメッセージの送信を担当するオブジェクト のメソッド (メソッド) である場合があります。 。 は関数 である場合もあります。はい、これは関数です。独立して存在し、オブジェクトとの関係なしに呼び出すことができる関数です。
言語設計者の妥協により、JavaScript を Java のように見せ、「オブジェクト指向」にするために、いくつかのクラス関連の機能が JavaScript に追加されました。 JavaScriptはnewとthisを追加していますが、クラスはありません(ESは追加しています)。最後に、関数は一時的にクラスのタスクを引き受けます。
セマンティクス 1: コンストラクターとして機能
/** * 页签 * * @class Tab * @param nav {string} 页签标题的class * @param content {string} 页面内容的class * */ function Tab(nav, content) { this.nav = nav; this.content = content; } Tab.prototype.getNav = function() { return this.nav; }; Tab.prototype.setNav = function(nav) { this.nav = nav; }; Tab.prototype.add = function() { }; // 创建对象 var tab = new Tab('tab-nav', 'tab-content');
ここでクラス Tab が定義され、オブジェクト タブが作成されます。上記では Function、this、new を使用しています。 this、new は一般的なオブジェクト指向言語のキーワードであり、ここでの function は従来のオブジェクト指向言語におけるクラスの役割を果たします。もちろん、このときの識別子の命名は一般的に「先頭文字を大文字にする」ルールに従います。
セマンティクス 2: オブジェクト メソッドとして機能
オブジェクトはクラスを使用せずに JavaScript で直接作成できるため、オブジェクトにメソッドを追加するには 2 つの方法があります。 1 つ目は、最初にクラスを定義し、プロトタイプ (上の例の Tab など) にメソッドをハングする方法です。プロトタイプには getNav、setNav、および add メソッドがあります。関数内でこれに直接メソッドを追加する別の方法もあります。
function Tab(nav, content) { this.nav = nav this.content = content this.getNav = function() { // ... } this.setNav = function() { // ... } this.add = function() { // ... } }
ここで Tab はセマンティクス、this.getNav/this.setNav/this.add はオブジェクトのメソッドとしてのセマンティクスです。 さらに、オブジェクトとそのメソッドを直接定義できます
var tab = { nav: '', content: '', getNav: function() { // ... }, setNav: function() { // ... }, add: function() { // ... } }
tab.getNav/tab.setNav/tab.add は、オブジェクト タブのメソッドとしてセマンティックです。
セマンティクス 3: 独立した関数として
/* * 判断对象是否是一个空对象 * @param obj {Object} * @return {boolean} */ function isEmpty(obj) { for (var a in obj) { return false } return true } // 定义一个模块 ~function() { // 辅助函数 function now() { return (new Date).getTime() } // 模块逻辑... }(); // 采用CommonJS规范的方式定义一个模块 define(require, exports, moduel) { // 辅助函数 function now() { return (new Date).getTime() } // 模块逻辑... })
isEmpty はグローバル関数として存在し、モジュール定義ではローカル関数として存在します。ここでの関数はオブジェクトやクラスに依存せず、独立して呼び出すことができます。
セマンティクス 4: 匿名関数定義モジュール
// 全局命名空间 var RUI = {} // ajax.js ~function(R) { // 辅助函数... ajax = { request: function() { // ... } getJSON: function() { // ... } ... } // 暴露出模块给 R R.ajax = ajax }(RUI); // event.js ~function(R) { // 辅助函数... // 事件模块定义... // 暴露出模块给 R R.event = event }(RUI); // dom.js ~function(R) { // 辅助函数... // DON模块定义... // 暴露出模块给 R R.dom = dom }(RUI);
ここでの匿名関数が実行された後、API オブジェクトは匿名関数内でどれだけ作業が行われても、対応する匿名関数の外部からは見ることができないため、注意を払う必要はありません。それに。最後の懸念事項は、パブリック API メソッドです。これらのメソッドのパラメータと意味を理解していれば、すぐに使用できます。
セマンティクス 5: 匿名関数は、変数をあまり公開せずに一部のデータを処理するなど、特定の特殊効果を処理します
// 判断IE版本的hack方式 var IEVersion = function() { var undef, v = var div = document.createElement('div') var all = div.getElementsByTagName('i') while ( div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[] ); return v > ? v : undef }();
最終的には、IEVersion という結果が 1 つだけあり、匿名関数内で使用されるいくつかのローカル変数はすべて分離できます。この方法は、一時的なデータ処理には非常に効果的でコンパクトです。
概要:
JavaScript は、Eich によって数日で設計されました。元々は、マーケティング上の理由から、Java に対応するために、Java に似たオブジェクト指向機能 (コンストラクター、this、new) が追加されました。 )。 thisとnewはコピーされますが、classの関数はfunctionに引き継がれます。その結果、JavaScript 関数はクラスを定義するために使用されることもあれば、メソッドまたは関数として使用されることもあります。また、モジュールなどの定義に使用できることを発見した人もいます。
ES の登場により、このすべてが終わりました。ES の予約語「クラス」は、クラスを定義するためにクラスを使用することが推奨されました。また、基本的に「クラスの継承」を実現する extend キーワードもあります。 Douglas 氏は、Nordic.js カンファレンスで、ES の最悪の設計の 1 つはクラスであるとコメントしました。また、これと new を使用することは推奨されていません。これは、彼が依然としてオブジェクトではなく関数型言語の使用を支持していることを示しています。クラスに基づいた - 指向。
上記の内容は、JavaScript の関数に関する私個人の複数の理解を示したものであり、異なる理解を持つ友人と共有し、一緒に学び、進歩することを歓迎します。