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 = '文本/javascript';
    scriptEl.innerHTML = script_content; // 到这里为止
    (函数(sc){
      评估(sc.innerHTML);// 不完全像这样,但你明白了,错误
      alert('不会到这里' + local_xw_sig); // local_xw_sig 是源内部的全局“var”
    })(scriptEl);
  }
});

到目前为止一切顺利,脚本确实包含来自整个脚本块的源代码。现在,在这个“script_content”里面,有自动执行的函数,比如 $(document).ready(function(){...}) ,我“评估”innerHTML的所有东西,它执行这段代码,停止我封装的脚本. 比如不存在的变量等等。

使用正则表达式删除脚本的某些部分并不是一个真正的选择......我真正想要的是在函数内部“行走”。就像做一个(完全虚构的):

script = eval("function(){" + script_content + "};");
警报(脚本['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

您想在全局范围内评估脚本。简而言之,

// Evalulates a script in a global context
globalEval: function( data ) {
        data = jQuery.trim( data );
        if ( data ) {
                if ( window.execScript )
                        window.execScript( data );
                else if ( jQuery.browser.safari )
                        // safari doesn't provide a synchronous global eval
                        window.setTimeout( data, 0 );
                else
                        eval.call( window, data );
        }
    }

还可以查看Google 的 caja以获取安全的外部脚本评估。

于 2012-09-10T05:32:45.573 回答
0

由于作用域,简单地尝试从函数外部访问函数内部的局部变量是不可能的。然而,使用闭包你绝对可以做到这一点:

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

请注意这里发生了什么。您正在调用一个返回函数的函数,该函数"yourMessage"现在在其范围内定义。第二次调用该内部闭包将产生您之前设置的变量。

如果你不熟悉 JS 中的闭包,我建议你阅读这个精彩的 FAQ

于 2010-03-27T09:45:42.223 回答
0

这是不可能的。您可以内省对象的属性(任何函数都是对象),但不能在您使用运算符创建实例之前new

查看您的代码示例,您的方法似乎有点混乱——除非绝对必要(我无法想象的情况),否则不应执行 eval()'ing 脚本块。

于 2010-03-27T09:57:57.920 回答