从幻影js获得奇怪的行为

时间:2017-08-25 16:24:40

标签: javascript phantomjs closures

我正在使用phantomjs来执行下面的代码。 我无法弄清楚这里有什么问题。

function process(arg1, arg2) {

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

    webpage.onConsoleMessage = function(msg) {
        // something
    };

    webpage.onError = function(msg, trace) {

        // something
    };

    webpage.open(entityResolvedFilePath, function(status) {
        if (status !== 'success') {

            abort(ErrorCode['HTML_LOAD_FAILURE']);

        } else {

            injectScriptsToWebpage(webpage);

            if (inputParams['myExpression']) {

                var outerWebPagescope=webpage;
                window.wepPage=webpage;
                webpage.evaluate(function() {

                    if (hasRequiredNoides(document)) {
                      //do something
                    }
                    else {

                        //outerWebPagescope.onCallback(); this also doesn't works
                        wepPage.onCallback();
                    }
                });
            }
            else {
                webpage.onCallback();
            }
        }
    });

    webpage.onCallback = function() {

        webpage.evaluate(function(inputParams) {
            //do something
        });

    };
}

当我在webpage.aun中调用webpage.evaluate时,它会创建一个新的函数范围,所以我通过创建引用 outerWebPagescope 来访问外部变量,但是我无法访问它。 据我所知,闭包这应该有用。

任何人都可以解释我这个。 不知怎的,我无法通过使用phantomjs调试回调代码,该代码从未在浏览器中命中我的调试器。

1 个答案:

答案 0 :(得分:0)

在PhantomJS中,page.evaluate内部的函数不仅仅是一个闭包,它存在另一个上下文(网页)的内部节点,其中所有外部变量和函数都不存在,而是一个网页' s可以使用DOM。

如果我了解您的意图,您希望从网页的上下文中与外部上下文进行交互。有两种方法:

•您可以return来自page.evaluate的数据,但它必须是一个简单的可序列化对象或数组。

•您可以调用一个特殊的效用函数window.callPhantom注入网页,以便进行这种互动:

page.evaluate(function(){
    if (typeof window.callPhantom === 'function') {
        window.callPhantom({ hello: 'world' });
    }
});

page.onCallback = function(data) {
  console.log('CALLBACK: ' + JSON.stringify(data));
  // Prints 'CALLBACK: { "hello": "world" }'
};

文档:http://phantomjs.org/api/webpage/handler/on-callback.html