Javascript.bind - ES5与ES6

时间:2016-07-17 06:11:01

标签: javascript ecmascript-6 bind

如何在ES6中使用bind?

在pre-es6编码方式中(我假设这是ES5),我会这样做:

var app = {};
app.log = function(req, res) {
    var respond = this.respond.bind(this, req, res);
    return respond(400, 'no data received');
}

app.respond = function(req, res, status, message) {
    console.log(req); // hello
    console.log(status); // 400
    console.log(message); // no data received
}

app.log('hello');

但我怎么能在ES6中做到这一点?

export default function log (req, res) {
    var respond = this.respond.bind(this, req, res);
    return respond(400, 'no data received');
}

function respond (req, res, status, message) {
    console.log(req); 
    console.log(status); 
    console.log(message); 
}

当然我会收到错误:

TypeError: Cannot read property 'respond' of undefined

2 个答案:

答案 0 :(得分:3)

您收到错误是因为您正在访问this.respond。但log(和respond)不再是对象方法,因此this不会使用respond方法引用对象。相反,您只需直接引用函数(respond):

this.respond(...)变为respond(...)

但是,根本没有理由使用.bind,甚至在您的ES5解决方案中也是如此(您永远不会在this内使用respond。)

您所要做的就是调用函数:

export default function log (req, res) {
  return respond(req, res, 400, 'no data received');
}

答案 1 :(得分:-1)

在这种情况下,我认为你不得不使用导出。简单地上课。

class App {

    log(req, res) {
        var respond = this.respond.bind(this , req , res);
        return respond(400, 'no data received');
    }

    respond(req, res, status, message) {
        console.log(req);
        console.log(status);
        console.log(message);
    }

}

var app = new App();
app.log('hello');