设置上下文时使用bind的替代方法是什么?

时间:2016-09-19 16:20:59

标签: javascript jquery bind

到目前为止,我在网络应用中使用了以下语法。

function.bind( obj );

所以我有一个像这样的对象:

myObj = {
    msg: 'You have logged ',
    init: function(){
        $( 'input' ).on( 'click', this.log.bind( this ) ),
    },
    log: function( e ){
        console.log( this.msg + $( e.target ).val() );
    }
}

我可以调用init函数。     myObj.init();

但问题是我读到了.bind函数()将被弃用。是jQuery绑定函数还是将被弃用的JavaScript绑定函数。

如果那将是不推荐使用的JavaScript函数,那么它的替代方案是什么?

2 个答案:

答案 0 :(得分:2)

  

但问题是我读到了.bind函数()将被弃用。是jQuery绑定函数还是将被弃用的JavaScript绑定函数。

没有问题,因为您没有使用$.bind,而您正在使用Function.prototype.bind

  

如果那将是不推荐使用的JavaScript函数,那么它的替代方案是什么?

Function.prototype.bind未被弃用。您的代码主要正常,少于以下例外

有关您的代码的一些注意事项

// no `var`, `let` or `const` keyword
myObj = {
  msg: 'You have logged ',
  init: function(){
    // event handlers usually pass an `event` object
    $( 'input' ).on( 'click', this.log.bind( this ) ),
  },
  log: function(){ // no `e` param here
    console.log( this.msg + $( e.target ).val() );
  }
}

可以更新为

var myObj = {
  msg: 'You have logged ',
  init: function(){
    $( 'input' ).on( 'click', this.log.bind( this ) ),
  },
  log: function(e){
    console.log( this.msg + $( e.target ).val() );
  }
}

使用ES6表达代码的完全替代方法 - arrow functions有一个词汇this,因此在此示例中不需要Function.prototype.bind

const myObj = {
  msg: 'You have logged ',
  init () {
    $('input').on('click', event => this.log(event));
  }
  log (event) {
    console.log(this.msg, $(event.target).val());
  }
};

答案 1 :(得分:1)

您目前可以使用$.proxy()。虽然在将来的jQuery版本中也可能不推荐使用注释$.proxy()

$( 'input' ).on( 'click', $.proxy( this.log, this ) )