1

[1] わかりました、正直に言うと、これをどう呼ぶかさえ知りません。それでは、私が何をしようとしているのかを示すために、いくつかの半疑似コードを取得しましょう。createDocument()私はjQueryを使用して、ページ内、要素内、AJAX呼び出しから宣言された既存のスクリプトを取得しています。

GM_xmlhttprequest({
  ...
  ロード:関数(r){
    var doc = document_from_string(r.responseText);
    script_content = $('body script:regex(html, local_xw_sig)', doc).html();
    var scriptEl = document.createElement('script');
    scriptEl.type = 'text/javascript';
    scriptEl.innerHTML = script_content; // ここまではいい
    (関数(sc){
      eval(sc.innerHTML); // これとまったく同じではありませんが、おわかりのように、エラーが発生します
      alert('ここに来ない' + local_xw_sig); // local_xw_sig はソース内のグローバルな「var」です
    })(scriptEl);
  }
});

これまでのところ、スクリプトには実際にスクリプト ブロック全体のソースが含まれています。さて、この「script_content」内には、$(document).ready(function(){...}) のような自動実行関数があり、すべてが innerHTML を「評価」し、このコードを実行して、カプセル化されたスクリプトを停止します。 . 存在しない変数など。

正規表現を使用してスクリプトの特定の部分を削除することは、実際にはオプションではありません...私が本当に望んでいたのは、関数内を「歩く」ことです。のように(完全に架空の):

script = eval("function(){" + script_content + "};");
alert(script['local_xw_sig']); // a03ucc34095cw3495

関数を「逆アセンブル」して、その中の「var」に到達できる方法はありますか? この関数のように:

関数ハロー(){
  var message = "こんにちは";
}
アラート (こんにちは。メッセージ); // message = 関数内の var

それはまったく可能ですか?または、正規表現を使用して自分のやり方をハックする必要がありますか? ;P

[2] また、「createDocument」で作成したドキュメント内で JavaScript にアクセスする方法はありますか?

4

4 に答える 4

0

あなたの例では

function hello(){
  var message = "hello";
}
alert(hello.message); // message = var inside the function

実際、次のように hello.toString() を使用して関数ソースを取得できます。

alert(hello.toString().match(/var message = \"(.*)\";/));
于 2011-01-12T15:32:35.790 に答える
0

関数の外側から関数内のローカル変数にアクセスしようとするだけでは、スコープが原因で不可能です。ただし、クロージャーを使用すると、これを完全に達成できます。

function hello(msg){
  return function message(){
    return msg;
  }
}
alert(hello("yourMessage")()); // will alert "yourMessage"

ここで何が起こっているかを正確にメモしてください。関数を返す関数を呼び出していますが、その関数はスコープ内で"yourMessage"定義されています。その内部クロージャーを 2 回目に呼び出すと、以前に設定した変数が生成されます。

JS のクロージャに慣れていない場合は、この素晴らしい FAQを読むことをお勧めします。

于 2010-03-27T09:45:42.223 に答える
0

そんなことはありえない。オブジェクトのプロパティ (関数はすべてオブジェクトです) を調べることはできますが、new演算子を使用してインスタンスを作成する前に行うことはできません。

あなたのコード サンプルを見ると、あなたのアプローチは少し乱雑に見えます。スクリプト ブロックを eval() することは、絶対に必要な場合 (私には想像できない状況) でない限り、すべきではありません。

于 2010-03-27T09:57:57.920 に答える