編集: 明確にするために、問題の機能によって暗示されるさまざまな問題の定性的なメリットに関するアドバイスや意見を求めているわけではありません。また、実際の問題に対する信頼できる解決策を探しているわけでもありません。タイトルの質問に対する技術的で検証可能な回答を探しているだけです。質問に、非準拠ブラウザのリストを追加しました。
関数の.toString
メソッドを使用すると、通常、その関数のソース コードがレンダリングされます。問題は、この動作が指定されていないことです— 仕様は、関数に適用されたときの動作がどうあるべきかについての約束を控えています。Chrome のコンソールは、(関数以外のものを に渡すとFunction.toString.call
) Function.prototype.toString が一般的ではないことを教えてくれます。
このブログ投稿は、複数行の文字列の読み取り可能な構文を生成する方法としてこれを使用できることを示唆しています (文字列をno-op 関数の本体に複数行のコメントとして格納することにより)。著者は、Node.js は制御された環境で実行されるため、この動作は信頼できるという条項を付けて、Node.jsアプリケーションを作成するコンテキストでこの使用法を提案しています。しかし、Javascript のネイティブ Web では、何でもやってきてそれを解釈することができ、不特定の動作に依存するべきではありません。
ただし実際には、コードをテストするために大きな複数行の文字列によって内容が決定される選択ボックスをレンダリングするフィドルを設定し、ワークステーションのすべてのブラウザー (Chrome 27、Firefox 21、Opera 12、Safari 5 、Internet Explorer 8) が意図したとおりに実行されます。
次のように動作しない現在の Javascript エンジンはどれですか?
とすれば:
function uncomment(fn){
return fn.toString().split(/\/\*\n|\n\*\//g).slice(1,-1).join();
}
以下:
uncomment(function(){/*
erg
arg
*/});
出力する必要があります:
erg
arg
非準拠ブラウザのリスト:
- Firefox 16
- …</li>