【问题标题】:Javascript: scope of the function within a fileJavascript:文件中函数的范围
【发布时间】:2014-05-12 05:21:33
【问题描述】:

我遇到了这个奇怪的问题,无法理解函数的作用域在文件中是如何工作的。

例如

function f3() {
}

function f2() {
   f3(); // Cannot find variable: f3
}

function f1() {
    f3(); // works fine
    f2(); // works fine
   }

f1();

已编辑

实际代码。

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 );

错误

ReferenceError: Can't find variable: fPrintObj

phantomjs://webpage.evaluate():6 in fGetXpathAd
phantomjs://webpage.evaluate():8
phantomjs://webpage.evaluate():8

【问题讨论】:

  • 我看不到您所说的“找不到变量:f3”错误是如何得到的。我怀疑上面不是导致上述错误的实际代码。
  • 您上面的代码在这里工作,jsfiddle.net/X887z/1 .. 我想还有其他问题。如果您发布您的实际代码会更好
  • 与您包含的代码完全一样,没有问题。因此,如果您遇到问题,那么您的真实代码并不像您在问题中描述的那么简单。您必须披露更多真正的问题,我们才能提供帮助。
  • 可能 f3 在浏览器上下文中,而 f1,f2 在 phantomjs 上下文中。只是一个猜测。请发布一些代码sn-p。
  • 我同意这听起来很奇怪。我正在 PhantomJs 上运行完整的代码。

标签: javascript node.js phantomjs


【解决方案1】:

在 phantomjs 中,page.evaluate 是一个页面上下文,你不能调用在它之外定义的函数。您应该将您的函数作为第二个参数传递给 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();
}

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2022-01-17
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多