ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のヒント 2.5_JavaScript のヒント

JavaScript のヒント 2.5_JavaScript のヒント

WBOY
WBOYオリジナル
2016-05-16 18:19:421105ブラウズ

前回のブログ投稿では、 JavaScript にラムダ式 と同様のプログラミング機能を持たせる方法を紹介しましたが、JavaScript の構文チェックと互換性がある必要があるため、さまざまな状況で使用できます。限定。

しかし、もっと注意深い友人の中には、私がその (擬似) Lambda モジュールでいくつかのトリックを使用していることに気付いたかもしれません。ここで、次のヒントを紹介します。

1. 新しい関数を使用します。構文チェックを実行します。

フレームワークを書こうとする学生は、このことについて深く感じているはずです。コードを通じて生成されたコードは、技術的なミスにより文法的なエラーを引き起こす場合があり、その結果、動作中に異常な中断が発生する場合があります。ユーザー入力を受け入れることができますが、ユーザーは意図的または非意図的に間違ったステートメントや式を作成する可能性があります。
この問題を解決するために、意図的に複雑な構文チェック プロセスを作成する (または既成の構文チェック プロセスを使用する) 学生もいます。しかし、コード構文を分析するコードを作成するのは非常に骨の折れる作業であり、一度問題が発見されると、調整するのも非常に困難です。不便です。
実際、この問題にはもっと簡単な解決策があります。それは、eval や new Function などのスクリプト エンジン独自の構文チェックを使用することです。もちろん、この eval を無差別に使用することはできません。eval が不適切に使用されると、問題はありますが、new Function はそれほど大きな問題ではありません。new Function によって構築された関数は、どのような状況でもグローバル スコープで直接動作しますが、単なる構文チェックであれば問題は発生しません。スコープの問題。構築された新しい関数を実際に直接呼び出さない限り、予期しない結果になります。

2. eval で受け入れられるパラメータの前に「0」を追加します。

実際には、これは IE のバグが原因です。

何らかの魔法の理由により、IE で eval を呼び出して関数を動的に構築する場合、関数の式の前後に括弧を追加するだけです。たとえば、

コードをコピーします コードは次のとおりです。

eval('(function(){ /* ここにコード */ })' );


はまだ未定義を返しますが、他のブラウザはこの新しく構築された関数への参照を正しく返します。
少し調べた結果、この問題を解決する最も簡単で効果的な方法は、先頭に「0」を追加することです。そうすれば、すべての (または少なくとも現在の 5 つの主要な) ブラウザーで使用できるようになります。期待通りの結果が得られました。
コードをコピー コードは次のとおりです。

eval('0,function(){ /* code here */ }');

注: この問題は IE9 の Chakra エンジンで解決されています~

3 の concat メソッドを使用します。配列オブジェクトを使用して新しい配列を生成します。

真剣に言うと、これは JavaScript では常識のはずです。結局のところ、このメソッドの使用法はどの JavaScript 言語関数のリファレンスにも記載されています。
しかし、生徒の中にはそれをいつ使用するかを覚えていない人もいるかもしれません。
私の (擬似) Lambda モジュールで、退屈して複数のエイリアスを使用して複数のオブジェクトに参照/値を同時にアタッチできる関数を書きました。この関数はオブジェクトをパラメーターとして受け入れることができ、また受け入れることもできます。オブジェクトのシーケンスをパラメータとして含む配列。
この関数が呼び出される頻度は低いため、この 2 つの状況に適応する (必ずしも最も効率的であるとは限りませんが) シンプルで効果的な方法を使用することにしました。それは、単一のオブジェクト パラメーターを 1 つだけを含む配列に変換することです。これに再度対処するために、「[].concat(o)」の形式を使用することにしました。
私のコードを読むと、コメントに別の方法が含まれていることがわかるかもしれません。それは、「if (!(o instanceof Array)) o = [o]」です。後で考えてみると、次のように感じました。第一に、(ECMAScript 5 の isArray と比較して) 厳密性が不十分であり、第二に、呼び出しの数が比較的少なく、パフォーマンスの向上も非常に限られていたため、前者を選択しました。
この記事を読んでいる方に、みんなにシェアしたい面白いテクニックはありますか?
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。