ホームページ ウェブフロントエンド jsチュートリアル 匿名関数は諸刃の剣であり、長所と短所があります。

匿名関数は諸刃の剣であり、長所と短所があります。

Jun 30, 2017 am 09:29 AM
使用 関数 匿名

関数型プログラミング言語として、JavaScript における関数の重要な位置と大きな役割が想像できるでしょう。しかし、それは非常に便利である一方で、必然的に大きな問題も引き起こします。

匿名関数は諸刃の剣であり、関数型プログラミング言語をより完璧なものにし、コードを読みにくくします。匿名関数にはセマンティクスに多大なコストがかかることを知っておく必要があります。

関数に名前がない場合、それは重要ではない可能性があり、ほとんどのシナリオでその意味が失われます。関数の名前は、自分の名前、友人の名前、ペットの名前と同じであることが重要です。そうでない場合、なぜそれを書く必要がありますか。

最も不必要な場所でも名前付き関数を使用することは非常に価値があります

おそらく、多くのシナリオを簡単に列挙して、匿名関数の利便性を証明することができます。いくつかのシナリオには間違いなくいくつかの意味があることは否定できません。 , しかし、ほとんどの人はこれを出発点として、小さなことほど良い行いをしません。たとえば、

Array.some、Array.forEach、String.replace

など、名前付き関数を使用する必要はなく、匿名関数を使用する方が便利であると自信を持って言えます。これを行います。ただし、forEach および replace の一部はすでに広範なセマンティクスを持っていることを忘れないでください。しかし、さらに一歩進めることもできます:

1.Array.some、大まかなセマンティクスは配列内に some があるかどうかを調べることですが、some とは正確には何でしょうか?

2.Array.forEach の広範なセマンティクスはトラバーサルです。Array はトラバーサル用の無数の関数を提供します。なぜ、map や each などの代わりに forEach を選択したのですか?

3.String.replace、広義のセマンティクスは置換ですが、正確には何に置き換えられるのでしょうか?

コードは人が読むために書かれています。

1. コードを読んで、配列から何を調べたいのかを推測または推測させてもらえませんか?

2. この配列を走査して何をしたいのかを関数名で直接教えていただけますか?

3. 関数名で直接置き換えたいものを教えていただけますか?

簡単な例として、価格配列に整数の価格があるかどうかを確認します。 isInteger は既存のパブリック関数である可能性があります。そうでない場合は、それが存在します。簡潔で読みやすいです。メインプロセスを読むときに、isInteger などのコードがエラーになったらどうなるでしょうか。 isInteger はテスト可能であり、心配な場合は単体テストを実行してください。小さな変更を加えることで、コードの一部がテスト可能になったことに気づいたかもしれません。これはパブリック関数ではありませんが、名前付き関数として作成した方がすっきりしていてテストしやすくなります。

var isAnyInteger =priceArr.some(Common.isInteger.bind(Common));

これらは、直接記述できる匿名関数とみなされるものの非常に極端な例ですが、名前を付けることもできることは明らかです関数境界処理、つまり名前付き関数の作成には何の害もありません。むしろ改善されるだけです。

どんなにコードが単純であっても、アーキテクチャと実装を区別する必要があります

もう一つの難題は、たとえ誰もがこのように書いたとしても、匿名関数のコードがこれほど醜いということはありません。 、これはできないことを理解する必要があります。 正しい姿勢は次のように書く必要があります。表示順序を例に挙げます:

/*
 * name        : getOrder
 * description : 获取订单数据 */function getOrder()
{//{{{var url = 'https://www.qunar.com/getOrder';//假如收集参数比较费劲,应该用一个函数专门去收集参数var params = getOrderParams();//假如参数体比较庞大,应该先将其赋予一个变量var params = {
        orderNo:'248663058'};//无论如何,现将参数赋予变量你都将获得在这里打印变量方便调试的便利console.log('getOrder url & params:', url, params);return $.post(url, params);
}//}}}/*
 * name        : renderOrder
 * description : 拿订单,拿到就在页面上展示出来,拿不到就告诉用户为什么没拿到 */function renderOrder()
{//{{{//高级函数,只安排工作,不自己实现//getOrder() 对该函数来说是不可见的,它要的只是订单数据,偷得抢的都可以    getOrder().then(render, remindUser);
}//}}}function render()
{//{{{}//}}}function remindUser()
{//{{{}//}}}
ログイン後にコピー

給料が入って働かない場合は $.post に書いてください 後でいいんじゃないでしょうか?

いいえ、いつか注文がローカルとローカル キャッシュの両方から取得できるようになった場合、getOrder は 2 つの関数 getOrderFromServer、getOrderFromCache を管理する準高度な関数にアップグレードされます

何かをした後、renderOrder はそれを冷静に処理できます。

オーバーデザインという言葉については考えないでください。ほとんどの人はこの能力を持っていないので、心配する必要はありません。

あなたは最初から上級アーキテクトですが、コードを書くのはパートタイムだけです

名前付き関数を多用することでコード構造が非常に明確になり、誰でも簡単に理解できることがわかります。メインプロセスは、名前付きの各関数を誰でも簡単に実装でき、実装する内容が関数名に明確に記述されています。

これらの名前付き機能は家の骨組みのようなもので、それを積み重ねることで建物の骨組みになります。建築デザイナーが自分で壁を作り、セメントを流し込んでいるのを見たことがあるでしょうか。コードを書く場合も同様で、関数は積み重ねられてスケルトンを形成します。各関数の実装方法については、実装を手伝ってください (最初に学習するときは、自分で実装するのを手伝ってもらいます)。

以上が匿名関数は諸刃の剣であり、長所と短所があります。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

BTCC チュートリアル: BTCC 取引所で MetaMask ウォレットをバインドして使用する方法は? BTCC チュートリアル: BTCC 取引所で MetaMask ウォレットをバインドして使用する方法は? Apr 26, 2024 am 09:40 AM

MetaMask (中国語ではリトル フォックス ウォレットとも呼ばれます) は、無料で評判の高い暗号化ウォレット ソフトウェアです。現在、BTCC は MetaMask ウォレットへのバインドをサポートしており、バインド後は MetaMask ウォレットを使用してすぐにログイン、値の保存、コインの購入などが可能になり、初回バインドで 20 USDT のトライアル ボーナスも獲得できます。 BTCCMetaMask ウォレットのチュートリアルでは、MetaMask の登録方法と使用方法、および BTCC で Little Fox ウォレットをバインドして使用する方法を詳しく紹介します。メタマスクウォレットとは何ですか? 3,000 万人を超えるユーザーを抱える MetaMask Little Fox ウォレットは、現在最も人気のある暗号通貨ウォレットの 1 つです。無料で使用でき、拡張機能としてネットワーク上にインストールできます。

golang 関数で新しい関数を動的に作成するためのヒント golang 関数で新しい関数を動的に作成するためのヒント Apr 25, 2024 pm 02:39 PM

Go 言語は、クロージャとリフレクションという 2 つの動的関数作成テクノロジを提供します。クロージャを使用すると、クロージャ スコープ内の変数にアクセスでき、リフレクションでは FuncOf 関数を使用して新しい関数を作成できます。これらのテクノロジーは、HTTP ルーターのカスタマイズ、高度にカスタマイズ可能なシステムの実装、プラグイン可能なコンポーネントの構築に役立ちます。

C++ 関数の命名におけるパラメーターの順序に関する考慮事項 C++ 関数の命名におけるパラメーターの順序に関する考慮事項 Apr 24, 2024 pm 04:21 PM

C++ 関数の名前付けでは、読みやすさを向上させ、エラーを減らし、リファクタリングを容易にするために、パラメーターの順序を考慮することが重要です。一般的なパラメータの順序規則には、アクション-オブジェクト、オブジェクト-アクション、意味論的な意味、および標準ライブラリへの準拠が含まれます。最適な順序は、関数の目的、パラメーターの種類、潜在的な混乱、および言語規約によって異なります。

Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Apr 24, 2024 am 11:33 AM

効率的で保守しやすい Java 関数を作成するための鍵は、シンプルに保つことです。意味のある名前を付けてください。特殊な状況に対処します。適切な可視性を使用してください。

Excel関数の公式の完全なコレクション Excel関数の公式の完全なコレクション May 07, 2024 pm 12:04 PM

1. SUM 関数は、列またはセルのグループ内の数値を合計するために使用されます (例: =SUM(A1:J10))。 2. AVERAGE 関数は、列またはセルのグループ内の数値の平均を計算するために使用されます (例: =AVERAGE(A1:A10))。 3. COUNT 関数。列またはセルのグループ内の数値またはテキストの数をカウントするために使用されます。例: =COUNT(A1:A10)。 4. IF 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

C++関数のデフォルトパラメータと可変パラメータの長所と短所の比較 C++関数のデフォルトパラメータと可変パラメータの長所と短所の比較 Apr 21, 2024 am 10:21 AM

C++ 関数のデフォルト パラメーターの利点には、呼び出しの簡素化、可読性の向上、エラーの回避などがあります。欠点は、柔軟性が限られていることと、名前の制限があることです。可変引数パラメーターの利点には、無制限の柔軟性と動的バインディングが含まれます。欠点としては、複雑さの増大、暗黙的な型変換、デバッグの難しさなどが挙げられます。

参照型を返す C++ 関数の利点は何ですか? 参照型を返す C++ 関数の利点は何ですか? Apr 20, 2024 pm 09:12 PM

C++ で参照型を返す関数の利点は次のとおりです。 パフォーマンスの向上: 参照による受け渡しによりオブジェクトのコピーが回避され、メモリと時間が節約されます。直接変更: 呼び出し元は、返された参照オブジェクトを再割り当てせずに直接変更できます。コードの簡素化: 参照渡しによりコードが簡素化され、追加の代入操作は必要ありません。

カスタム PHP 関数と定義済み関数の違いは何ですか? カスタム PHP 関数と定義済み関数の違いは何ですか? Apr 22, 2024 pm 02:21 PM

カスタム PHP 関数と定義済み関数の違いは次のとおりです。 スコープ: カスタム関数はその定義のスコープに限定されますが、事前定義関数はスクリプト全体からアクセスできます。定義方法: カスタム関数は function キーワードを使用して定義されますが、事前定義関数は PHP カーネルによって定義されます。パラメータの受け渡し: カスタム関数はパラメータを受け取りますが、事前定義された関数はパラメータを必要としない場合があります。拡張性: カスタム関数は必要に応じて作成できますが、事前定義された関数は組み込みで変更できません。

See all articles