替换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

我在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.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);
}