Javascript 找不到全局定义的变量
我已经声明了一个全局变量,Javascript 找不到全局定义的变量,javascript,arrays,node.js,global-variables,phantomjs,Javascript,Arrays,Node.js,Global Variables,Phantomjs,我已经声明了一个全局变量,var linkArray=[],但它没有在phantomJS函数中被提取。错误消息是:phantom标准输出:引用错误:找不到变量:linkArray。我怎样才能找到这个?我尝试用window.linkArray声明它,但由于这是一个无头应用程序,因此我得到了另一个错误,ReferenceError:window未定义 因此,我需要一种使var linkArray=[]全局化的方法 var phantom = require('phantom'); var link
var linkArray=[]
,但它没有在phantomJS
函数中被提取。错误消息是:phantom标准输出:引用错误:找不到变量:linkArray
。我怎样才能找到这个?我尝试用window.linkArray
声明它,但由于这是一个无头应用程序,因此我得到了另一个错误,ReferenceError:window未定义
因此,我需要一种使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
}
});
var phantom=require('phantom');
var linkArray=[];
幻影创建(功能(ph){
ph.createPage(函数(第页){
var main_文件=”file:///C:/whatever/index.html";
页面打开(主文件、功能(状态){
console.log(“已打开”+主\u文件+“\n”,状态+“\n”);
求值(函数(){
对于(var i=0;i
PhantomJS有页面上下文和外部上下文。页面上下文是沙盒式的,因此需要显式地将变量传递给它。它是按值传递的。他们说:
在网页上下文中计算给定函数。执行是沙盒式的,网页无法访问幻影对象,也无法探测自己的设置
但也要注意这一点
注意: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
page.evaluate(函数(linkArray){
//页面上下文,linkArray现在是一个局部变量
对于(var i=0;i
我正在使用node,所以我使用npm
安装phantom
,然后声明var phantom=require('phantom')代码>。还有很多。我发现这两个问题的答案是一样的。嗯,这是在识别linkArray,但由于某种原因,如果在最后一行(},linkArray)之后运行console.log(linkArray)
,则返回一个空数组代码>)这是因为它是异步的,您中断了控制流(在完成的函数中)。太棒了!谢谢你的帮助:)PhantomJS通向回调地狱,尤其是那些桥梁。你可以试试另一座像这样的桥。它有一个类似于CasperJS的高级API。