Javascript:文件中函数的作用域

Javascript:文件中函数的作用域,javascript,node.js,phantomjs,Javascript,Node.js,Phantomjs,我有一个奇怪的问题,无法理解函数的作用域在文件中是如何工作的 例如。 编辑 实际代码 var page = require('webpage').create(); function fPrintObj(obj) { // Object properties var output = ''; for (var property in obj) { output += property + ': ' + obj[property]+'; '; }

我有一个奇怪的问题,无法理解函数的作用域在文件中是如何工作的

例如。 编辑 实际代码

var page = require('webpage').create();

function fPrintObj(obj) {
    // Object properties
    var output = '';
    for (var property in obj) {
        output += property + ': ' + obj[property]+'; ';
    }
    console.log(output);
}

function  fGetXpathAd() {
    xPathAd = "//div[@class='col-xs-12 col-sm-12 col-md-12 col-lg-12 home-solutions-head']";
    console.log(xPathAd);

    var adcopy = document.evaluate( xPathAd, document, null, XPathResult.STRING_TYPE, null);
    fPrintObj(adcopy);  //DOES NOT WORK
    return adcopy;  
}

function main(status) {

        console.log('Evaluating ad-copy.... ');
        var a = page.evaluate(fGetXpathAd);
        // fPrintObj(a);  // WORKS

    phantom.exit();
}

//  fSetRandomUserAgent();
page.open('https://www.position2.com', main );

错误


在phantomjs中,page.evaluate是一个页面上下文,您不能调用在此上下文之外定义的函数。您应该将函数作为第二个参数传递给页面。请按如下方式计算:

function  fGetXpathAd(fPrintObj) {
    xPathAd = "//div[@class='col-xs-12 col-sm-12 col-md-12 col-lg-12 home-solutions-head']";
    console.log(xPathAd);

    var adcopy = document.evaluate( xPathAd, document, null, XPathResult.STRING_TYPE, null);
    fPrintObj(adcopy);  //WILL WORK
    return adcopy;  
}

function main(status) {

        console.log('Evaluating ad-copy.... ');
        var a = page.evaluate(fGetXpathAd, fPrintObj);
        // fPrintObj(a);  // WORKS

    phantom.exit();
}

我希望这会有所帮助。

我看不出您是如何得到您所说的“找不到变量:f3”错误的。我怀疑上面的代码不是导致上述错误的实际代码。您上面的代码在这里工作。。我想还有其他问题。如果您发布您的实际代码,则会更好。完全按照您所包含的代码,代码没有问题。因此,如果您遇到问题,那么您的实际代码并不像您在问题中描述的那么简单。您将不得不透露更多的真实问题,以便我们能够提供帮助。可能是f3在浏览器上下文中,f1、f2在phantomjs上下文中。只是猜测而已。请发布一些代码片段。我同意这听起来很奇怪。我正在PhantomJs上运行完整的代码。
ReferenceError: Can't find variable: fPrintObj

phantomjs://webpage.evaluate():6 in fGetXpathAd
phantomjs://webpage.evaluate():8
phantomjs://webpage.evaluate():8
function  fGetXpathAd(fPrintObj) {
    xPathAd = "//div[@class='col-xs-12 col-sm-12 col-md-12 col-lg-12 home-solutions-head']";
    console.log(xPathAd);

    var adcopy = document.evaluate( xPathAd, document, null, XPathResult.STRING_TYPE, null);
    fPrintObj(adcopy);  //WILL WORK
    return adcopy;  
}

function main(status) {

        console.log('Evaluating ad-copy.... ');
        var a = page.evaluate(fGetXpathAd, fPrintObj);
        // fPrintObj(a);  // WORKS

    phantom.exit();
}