Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用CasperJS访问页面上的内部范围变量值_Javascript_Variables_Casperjs - Fatal编程技术网

Javascript 使用CasperJS访问页面上的内部范围变量值

Javascript 使用CasperJS访问页面上的内部范围变量值,javascript,variables,casperjs,Javascript,Variables,Casperjs,我是CasperJS的新手,正在尝试从网站上获取一些JS代码。假设我得到了这个代码: <html> ... <script type="text/javascript"> var a = "true"; function abc(){ var b = "someValue"; b = b + " and other value"; } </script> ... ... </html> 但

我是CasperJS的新手,正在尝试从网站上获取一些JS代码。假设我得到了这个代码:

<html>
...
<script type="text/javascript">
    var a = "true";

    function abc(){
        var b = "someValue";
        b = b + " and other value";
    }
</script>
...
...
</html>

但无法找到获得“b”值的方法(如果可能的话)。我正在考虑下载整个页面,然后离线解析它,但也许有人知道更好的利用CasperJS的方法。

JavaScript具有功能级别的作用域。这意味着在带有
var
let
关键字的函数中定义的变量是局部变量。无法从外部作用域访问它们。如果可以,这将非常奇怪,因为这意味着函数处于某种挂起执行状态。无法直接访问
b

您认为需要以某种方式解析函数以检索该值是正确的。似乎包含感兴趣值的函数是全局定义的,因此您可以访问该函数对象

例如,您可以删除所有使此
abc
函数成为函数和
eval
函数的内容。这将使您能够直接访问
b

半伪码:

var b = casper.evaluate(function(){
    var abcFnString = abc.toString()
        .replace("function abc(){", "") // remove header
        .replace(/return/g, "")         // remove returns
        .slice(0, -1);                  // removed footer
    return (function(){
        eval(abcFnString);
        return b;
    })();
});

无法直接访问
b
var b = casper.evaluate(function(){
    var abcFnString = abc.toString()
        .replace("function abc(){", "") // remove header
        .replace(/return/g, "")         // remove returns
        .slice(0, -1);                  // removed footer
    return (function(){
        eval(abcFnString);
        return b;
    })();
});