1

我有波纹管类:如何使用嵌套函数访问globar变量? JavaScript的

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是我可以从任何嵌套函数访问的全局变量。对 ?

谢谢

+0

尝试window.x并检查拼写和capatals – user7951676

+0

为了得到更好的答案,您可以提供一个最小的问题和预期的行为小提琴 –

回答

1

这是使用诸如Casper之类的东西时的常见问题。

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

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

你是不是要能够给一个函数传递到casper.evaluateevaluate()基本上呼吁phantomjs的evaluate(),所以他们docs是有帮助的:

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

那么,你是那种卡住,需要找到不同的方式来做到这一点。

0

x不是一个全局变量,它是本地casperInstance功能。我建议

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

谢谢你的答案,但它不工作,我收到这个错误:TypeError:undefined不是一个对象(评估'this.casper.selectXPath') –