如果定义绑定函数,PhantomJs会崩溃

时间:2015-06-21 15:57:26

标签: javascript phantomjs

PhantomJs不支持bind方法(Function.prototype.bind)。您可以查看Issue #10522了解详情。

但您可以在js代码中定义它。一个简单的版本是这样的:

Function.prototype.bind = Function.prototype.bind || function (thisp) {
    var fn = this;
    return function () {
        return fn.apply(thisp, arguments);
    };
};

或者您可以使用bind-polyfill

它有效,但问题是在某些情况下PhantomJs崩溃了。这是我的代码bind函数,它不是Function原型的一部分,但它没有改变任何东西,其他版本的结果相同:

var webpage = require('webpage');

var bind = function(fn, scope) {
    return function() {
        // console.log(fn);
        return fn.apply(scope, arguments);
    };
};

var WebPage = (function() {

    var WebPage = function() {
        this.page = webpage.create();
        this.page.onConsoleMessage = bind(this.on_console_message, this);
    };

    WebPage.prototype.open = function(url) {
        this.url = url;
        this.page.open(url, bind(this.on_open, this));
    };

    WebPage.prototype.on_open = function(status) {
        if(status != 'success') {
            console.log('page opening status: ' + status);
            phantom.exit();
        }
        this.page.evaluate(function() {
            console.log('here');
        });
        phantom.exit();
    };

    WebPage.prototype.on_console_message = function(msg) {
        console.log(msg);
    };

    return WebPage;

})();

page = new WebPage();
var url = 'http://localhost:8000/index.html';
page.open(url);

这是我用python -m SimpleHTTPServer

提供的index.html文件
<!doctype html>
<html>
<head>
    <title>Test Page</title>
</head>
<body>
</body>
</html>


> phantomjs test.js
PhantomJS has crashed. Please read the crash reporting guide at https://github.com/ariya/phantomjs/wiki/Crash-Reporting and file a bug report at https://github.com/ariya/phantomjs/issues/new with the crash dump file attached: /tmp/1fb7d785-11ed-5883-6c4f0088-5aa5e04f.dmp
Segmentation fault (core dumped)

如果您在console.log(fn)函数中取消注释bind,则可以看到它适用于on_open方法,但在尝试访问on_console_message方法时会崩溃。

我在两台机器(Ubuntu 14.04 / x86_64)上使用v1.9.7和1.9.8进行了测试。似乎minidump_stackwalk不包含有用信息(here是一个转储)

0 个答案:

没有答案