web-dev-qa-db-ja.com

JavaScript関数でtoStringを呼び出すと、ソースコードが返されます

myFunction.toString()のように、JavaScript関数でtoString()を呼び出すと、その関数のソースコードが返されることがわかりました。

FirebugまたはChromeコンソールで試してみると、最小化されたJavaScriptファイルであっても、適切にフォーマットすることができます。
難読化されたファイルの処理方法がわかりません。

そのようなtoString実装の用途は何ですか?

33
Sergi Papaseit

関数のコードを確認できるため、デバッグに役立ちます。関数が上書きされているかどうか、変数が正しい関数を指しているかどうかを確認できます。

難読化されたjavascriptコードのいくつかの用途があります。 JavaScriptでハードコア難読化を行う場合は、コード全体を一連の特殊文字に変換し、数字や文字を残さないようにすることができます。この手法は、+""を使用してすべてに対してtoString呼び出しを強制することにより、アルファベットのほとんどの文字にアクセスできることに大きく依存しています(例:(![]+"")[+[]]f)。 vなどの一部の文字は、[].sortなどのネイティブ関数でtoStringを呼び出してのみアクセスできます。文字vは、難読化されたコードにとって重要です。これにより、evalを呼び出すことができます。これにより、文字を使用せずに、ループさえも実行できます。 これはこの例です

25
HoLyVieR

function.ToString-関数のソースコードを表す文字列を返します。 Functionオブジェクトの場合、組み込みのtoStringメソッドは、関数を逆コンパイルして、関数を定義するJavaScriptソースに戻します。

Mozillaで this を読んでください。

8
CloudyMarble

JavaScriptソースの複数行文字列の実装として使用できます。

@ tjanczukによるこのブログ投稿 で説明されているように、Javascriptの大きな不便の1つは複数行の文字列です。ただし、.toString()および複数行コメントの構文(_/* ... */_)を利用して同じ結果を生成できます。

以下の関数 を使用する:

_function uncomment(fn){
  return fn.toString().split(/\/\*\n|\n\*\//g).slice(1,-1).join();
};
_

…次に、次の形式で複数行のコメントを渡すことができます。

_var superString = uncomment(function(){/*
String line 1
String line 2
String line 3
*/});
_

元の記事では、Function.toString()の動作は標準化されていないため、実装が不明確であることが指摘されていました。推奨される使用法はNode.jsです(V8インタープリターが信頼できる場合)。ただし、 a Fiddle私が書いたものは、私が使用できるすべてのブラウザで動作するようです (Chrome 27、Firefox 21、Opera 12、Internet Explorer 8)。

7
Barney

素敵なユースケースはリモーティングです。クライアントの関数をtoStringし、ネットワーク経由で送信してサーバーで実行するだけです。

1
R.Moeller

これを使用して、メインスクリプトで定義された関数からWebワーカーを作成できます。

onmessage = function(e) {
  console.log('[Worker] Message received from main script:',e.data);
  postMessage('Worker speaking.');
}

b = new Blob(["onmessage = " + onmessage.toString()], {type: 'text/javascript'})

w = new Worker(window.URL.createObjectURL(b));

w.onmessage = function(e) {
    console.log('[Main] Message received from worker script:' + e.data);
  };

w.postMessage('Main speaking.');
0
Kpym

私の使用例-データを処理し、html/js/cssファイルとしてインタラクティブなレポートを生成するノードプログラムがあります。 js関数を生成するために、私のノードコードはmyfunc.toString()を呼び出し、それをファイルに書き込みます。

0
Ken Lin