微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用回调和闭包时在Javascript中保留对“ this”的引用

如何解决使用回调和闭包时在Javascript中保留对“ this”的引用

处理this回调的主要方法有三种:

1.按照当前操作,创建一个词法范围的变量

此新变量的两个最常见的名称thatself。我个人更喜欢使用,that因为浏览器具有一个名为self的全局窗口属性,而我的linter会在我遮挡它时抱怨。

function edit(req, res) {
    var that = this,
    db.User.findById('ABCD', function(err, user){
        that.foo(user);
    });
};

这种方法一个优点是,一旦代码转换为使用代码that您就可以根据需要添加任意数量的内部回调,并且由于词法作用域,它们都将无缝运行。另一个优点是它非常简单,即使在古老的浏览器上也可以使用。

2.使用.bind()方法

Javascript函数具有一种.bind()方法,可让您创建具有固定的版本this

function edit(req, res) {
    db.User.findById('ABCD', (function(err, user){
        this.foo(user);
    }).bind(this));
};

当涉及到处理时this,bind方法对于其中一种回调特别有用,在这种回调中,必须添加包装函数会更加冗长:

setTimeout(this.someMethod.bind(this), 500);

var that = this;
setTimeout(function(){ that.doSomething() }, 500);

其主要缺点bind是,如果您具有嵌套的回调,则还需要调用bind它们。此外,IE <= 8和其他一些旧的浏览器并没有本地实现该bind方法,因此,如果仍然需要支持它们,则可能需要使用某种匀场库

3.如果需要对函数范围或参数进行更细粒度的控制,请退回到.call()和.apply()

更原始的方式来控制功能参数在Javascript中,包括this,都是.call().apply()方法。它们使您可以使用任何对象作为对象并将其this值作为参数来调用函数apply对于实现可变参数函数特别有用,因为它以数组形式接收参数列表。

例如,这是bind的一个版本,它接收要作为字符串进行绑定的方法。这使我们this仅写下一次而不是两次。

function myBind(obj, funcname){
     return function(/**/){
         return obj[funcname].apply(obj, arguments);
     };
}

setTimeout(myBind(this, 'someMethod'), 500);

解决方法

我发现自己将“ this”分配给变量,因此可以轻松地在回调和闭包中使用它。

这是不好的做法吗?有没有更好的方法可以参考原始功能?

这是一个典型的例子。

User.prototype.edit = function(req,res) {

  var self = this,db = this.app.db;

  db.User.findById('ABCD',function(err,user)) {

    // I cannot use this.foo(user)
    self.foo(user);
  });
};

User.prototype.foo = function(user) {

};

您通常使用这种方法还是找到了更清洁的解决方案?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。