未找到全局定义的变量

时间:2014-10-09 14:19:12

标签: javascript arrays node.js global-variables phantomjs

我已经声明了一个全局变量var linkArray=[],但它没有在phantomJS函数中被拾取。错误消息为:phantom stdout: ReferenceError: Can't find variable: linkArray。我怎样才能找到这个?我尝试用window.linkArray声明它,但由于这是一个无头应用程序,然后我得到一个不同的错误,ReferenceError: window is not defined

因此,我需要一种方法使var linkArray=[]全局化。

var phantom = require('phantom');

var linkArray=[];

phantom.create(function (ph) {
    ph.createPage(function (page) {
        var main_file="file:///C:/whatever/index.html";
        page.open(main_file, function (status) {
            console.log("opened " + main_file +"\n",status+"\n");
            page.evaluate(function () { 
                for (var i=0; i < document.getElementsByTagName('a').length; i++) {
                    linkArray.push(document.getElementsByTagName('a')[i].href)
                }
                return linkArray; 
            }
            , function (result) {
                console.log(result)
                ph.exit();
            });

        });
    });
}, {
    dnodeOpts: {
        weak: false
    }        
});

1 个答案:

答案 0 :(得分:2)

PhantomJS有一个页面上下文和外部上下文。页面上下文是沙箱,因此您需要将变量显式传递给它。它按值传递。 docs说:

  

在网页的上下文中评估给定的函数。执行是沙盒,网页无法访问幻像对象,它无法探测自己的设置。

但请注意 note

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等不起作用!

要解决此问题,必须将外部变量传递到页面上下文(evaluate)并返回

page.evaluate(function(linkArray) { 
    // page context, linkArray is a local variable now
    for (var i=0; i < document.getElementsByTagName('a').length; i++) {
        linkArray.push(document.getElementsByTagName('a')[i].href)
    }
    return linkArray;
}, function finished(result) {
    // outer context
    console.log(result)
    linkArray = result;
    ph.exit();
}, linkArray); // pass values for the page context as last parameters