没有find全局定义的variables

我已经声明了一个全局variablesvar linkArray=[] ,但是它并没有在phantomJS函数中被拾取。 错误消息是: phantom stdout: ReferenceError: Can't find variable: linkArray 。 我怎样才能find这个? 我试着用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 } }); 

PhantomJS有页面上下文和外部上下文。 页面上下文是沙箱,所以你需要明确地将variables传递给它。 它通过价值传递。 文档说:

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

但是也要注意这个笔记

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

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

为了解决这个问题,必须将外部variables传递给页面上下文( 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