PhantomJS:如何访问全局函数和变量?

时间:2017-10-25 12:21:03

标签: javascript scope phantomjs global globals

我正在尝试通过PhantomJS运行.js并在页面上下文中使用一些全局函数或变量。

这是一个最小的例子:

var page = require('webpage').create(); // or: var page = new WebPage();

// reroute page's console to global console
page.onConsoleMessage = function(msg) { console.log(msg) }

function Foo(x) { return "bar"+x }

page.open( 'https://www.example.com/', function(){

    console.log(Foo(1)); // works OK

    page.evaluate( function(){

        console.log('test'); // works OK (message appears because we rerouted 
                             // the page's console to global console output)

        console.log(Foo(2)); // does NOT work, Foo is unknown
    });

    console.log(Foo(3)); // works OK
    phantom.exit();

});

请注意在Foo()函数的上下文中如何知道evaluate()函数。

我尝试了很多方法,例如在page.Foo2 = Foo;的定义下面Foo,然后在evaluate上下文中我调用Foo2(2),但不是。 / p>

page.Foo2 = function(x) { return Foo(x) }但是再次无济于事。也不是通过调用this.Foo2(2)而不仅仅是Foo2(2)(如果这有意义的话)。

如何访问page范围之外的函数或变量?

1 个答案:

答案 0 :(得分:0)

您可以在沙箱上下文中声明一个函数:

page.open( 'https://www.example.com/', function(){

    page.evaluate( function(){

        function Foo(x) { return "bar"+x }

        console.log(Foo(2));
    });

    phantom.exit();
});

或者,如果您还需要在全局环境中使用它,可以将其发送到沙箱中:

function Foo(x) { return "bar"+x }

page.open( 'https://www.example.com/', function(){

    console.log(Foo(1));

    page.evaluate( function(Foo){

        console.log(Foo(2));

    }, Foo);

    console.log(Foo(3));

    phantom.exit();
});