如何使用嵌套函数访问globar变量? JavaScript的

时间:2017-09-17 03:03:37

标签: javascript global-variables javascript-objects nested-function

我有吼叫班:

var CasperInstance = function(casper) {

    this.casper = casper;
    var x = casper.selectXPath;
    var parent = this;


    this.then = function(callback) {

        return this.casper.then(function() {

            parent.casper.evaluate(function() {

                try {
                    x('//*[@id="email_address"]');
                } catch (err) {

                    //ReferenceError: Can't find variable: x
                    console.log(err);
                }

            });

        });

    };


};

当我尝试调用x()时,我收到此错误:ReferenceError: Can't find variable: x

然而x是全局变量,我可以从任何嵌套函数访问。对吗?

谢谢

2 个答案:

答案 0 :(得分:1)

使用Casper等内容时,这是一个常见问题。

通常,javascript函数会在闭包中捕获x,并且该范围内的函数可以使用它。这就是它应该在这里发生的事情。但问题是casper.evaluate()明确地避免了这一点 - evaluate()的意思是使用当前页面DOM的上下文。这意味着您只能访问页面范围。在这一点上,文档实际上非常好:

http://docs.casperjs.org/en/latest/modules/casper.html#evaluate

您无法将功能传递到casper.evaluateevaluate()基本上是调用phantomjs的evaluate(),所以他们的docs很有用:

  

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

所以你有点困难,需要找到一种不同的方法来做到这一点。

答案 1 :(得分:0)

x不是全局变量,它是casperInstance函数的本地变量。我建议

this.casper.selectXPath('//*[@id="email_address"]');