替换javascript中的匿名函数更改代码的执行方式
我在casperJS中调用了一些javascript代码,代码很短,所以我包含了整个清单替换javascript中的匿名函数更改代码的执行方式,javascript,anonymous-function,Javascript,Anonymous Function,我在casperJS中调用了一些javascript代码,代码很短,所以我包含了整个清单 var links = []; var casper = require('casper').create(); function getLinks() { var links = document.querySelectorAll('table'); return Array.prototype.map.call(links, function(e) { return e.getAtt
var links = [];
var casper = require('casper').create();
function getLinks() {
var links = document.querySelectorAll('table');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('id');
});
}
casper.start('example.html', function() {
links = this.evaluate(getLinks);
});
casper.run(function() {
this.echo(links.length + ' links found:');
this.echo(' - ' + links.join('\n - ')).exit();
});
这将输出预期的结果
3 links found:
- table A
- table B
- table C
而切换到在getLinks中中断匿名函数,以便用以下两个函数替换getLinks
function extract(e) {
return e.getAttribute('id');
}
function getLinks() {
var links = document.querySelectorAll('table');
return Array.prototype.map.call(links, extract);
}
屈服
TypeError: 'null' is not an object (evaluating 'links.length')
/Users/jrrpl/git/gamecock/download.js:18
/usr/local/Cellar/casperjs/1.1-beta3/libexec/modules/casper.js:408 in checkStep
更新
对命名函数的引用似乎会导致casper.run()提前执行。有人知道为什么会发生这种情况吗?问题出在
这个.evaluate(getLinks)代码>:
基本相当
理解评估()
这种方法背后的概念可能是最难理解的
了解如何发现CasperJS。作为提醒,想想
evaluate()方法作为CasperJS环境和
你打开的一页;每一次你通过一个关闭
evaluate(),您将进入页面并像执行代码一样执行代码
使用浏览器控制台
甚至PhantomJS文档也没有说明(还有吗?我错过了吗?)到底发生了什么。虽然很明确,
然后它就可以工作了。这些看起来是等效的,所以一定发生了其他事情。请向我们展示如何定义链接的代码。您是否尝试过在匿名函数和命名的提取
函数中设置断点来比较发生了什么?在这两个位置检查e
的一些值可能非常有用。也可能存在变量名冲突。querySelectorAll
永远不会返回null
,也不会返回Array.prototype.map
,因此我认为我们遗漏了一些东西。这是一个完整的示例,还是您更改了一些内容使其更短?
page.evaluate = function (func, args) {
var str, arg, argType, i, l;
if (!(func instanceof Function || typeof func === 'string' || func instanceof String)) {
throw "Wrong use of WebPage#evaluate";
}
str = 'function() { return (' + func.toString() + ')(';
for (i = 1, l = arguments.length; i < l; i++) {
…
str += JSON.stringify(arg) + ",";
…
}
str = str.replace(/,$/, '') + '); }';
return this.evaluateJavaScript(str);
};
function getLinks() {
function extract(e) {
return e.getAttribute('id');
}
var links = document.querySelectorAll('table');
return Array.prototype.map.call(links, extract);
}