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') –