ホームページ  >  記事  >  ウェブフロントエンド  >  匿名関数は諸刃の剣であり、長所と短所があります。

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

零下一度
零下一度オリジナル
2017-06-30 09:29:371470ブラウズ

関数型プログラミング言語として、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 までご連絡ください。