0

私は小さな単一ページのアプリ (knockout.js を使用して :-)) を書いています。これにより、一連の JavaScript コードの例が得られます。このコードは関数にラップされており、関数で toString を呼び出して、ブラウザーにソース コードを表示します。

全体として、すべてがうまく機能します!ただし、例の性質上 (学習演習として)、通常は冗長と見なされるコードが含まれています。たとえば、次のコードは、javascript で false-y 値を示す例です。

var example = function() {
    if("" || 0 || null || undefined || NaN) {
     console.log("i'll never be logged");
    }
    else {
     console.log("i'll always be logged");
    }
};

Firefox では、example.toString()返された文字列に が含まれていない場合0nullまたは""- そのため、私の例は正確に描写されていません! ただし、IE では、前述の値はtoString()呼び出しの結果に含まれますが、文字列は 1 行だけで、インデントなどはありません。

だから私が疑問に思っていたのは

1.より可能性の高い解決策: JavaScriptコードの長い1行の文字列が与えられた場合、書式設定/インデントを処理するJS実装のコードハイライターを誰もが知っています。または、この種の機能を提供するための単純な拡張性を可能にするハイライター

  1. 可能性が低い解決策:誰かがFFで正確な結果を得る方法を知っているか、または適切に

アプリを完璧にしたい結果が得られないのは本当にイライラします:)

編集:私は密集していたようです.IEは正しくフォーマットされています.アプリをビルドするときに使用していた基本的な例では、関数を1行として宣言したため、フォーマットは正確に引き継がれました! したがって、Web の歴史の中で一度だけ、IE は問題なく期待どおりに機能します :) Firefox が文字列表現からコードの特定の部分を削除する理由を誰かが提供してくれるとうれしいです

4

1 に答える 1

1

まず、スクリプトエンジンでコードを最適化できます。コンパイラが実行されないブランチを検出した場合、コンパイラはそれらをトリミングする可能性があります。

次に、Function.prototype.toStringは実装に依存します。

ECMA–262 15.3.4.2 Function.prototype.toString()

関数の実装に依存する表現が返されます。この表現には、FunctionDeclarationの構文があります。特に、表現文字列内の空白、行末記号、およびセミコロンの使用と配置は、実装に依存することに注意してください。

スクリプトコンテンツを適切にフォーマットする場合は、script要素への参照を取得し、そのtextContentまたはinnerText(サポートされている方)を使用します。

ただし、適切にフォーマットされたコードが必要な場合は、「javascriptprettyprint 」を検索するかHTMLで自分で実行してください。

于 2011-08-01T05:04:54.253 に答える