关于javascript:将此参数绑定到命名参数 | 珊瑚贝

Bind this argument to named argument

本问题已经有最佳答案,请猛点这里访问。


如果我的代码结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
 Thing.prototype = {

    doSomething: function() {
      $(selector).click(this.handleClick.bind(null, this));
    },

    handleClick: function(self, event) {
      console.log(this); //Window
      console.log(self); //Thing
    }

 }

如何将 Thing this 上下文绑定到 self 参数,并且仍然保持 this 对象的行为,就好像没有使用 bind 方法绑定参数一样?

注意:我知道我可以绑定 this 并使用 e.originalEvent.target 来获得我想要的行为,但我只是好奇是否还有其他方法

我希望我能完成我想要实现的目标,如果有任何不明确的地方,请发表评论。

  • 不,我想使用处理程序的原始 this (单击的元素),但将 Thing this 传递给 self 变量。


How could one bind the Thing this context to the self argument and still keep the behavior of the this object as if no arguments were bound using the bind method?

您不会为此使用 bind,因为您希望 this 是动态的。而是:

1
2
3
4
5
6
doSomething: function() {
  var self = this;
  $(selector).click(function(e) {
      return self.handleClick.call(this, self, e);
  });
},

在 handleClick 期间,this 将引用被点击的元素,第一个参数是 Thing 实例,第二个参数是事件:

1
2
3
4
5
handleClick: function(self, event) {
  console.log(this);  // The clicked element
  console.log(self);  // The Thing
  console.log(event); // The event
}
  • 太好了,我仍在尝试绕过 bind 行为。如果有任何可用的东西,欢迎从文档页面对此行为进行彻底解释:)
  • @SpyrosMandekis 这里有一些关于 .bind() 的不错的文档和示例,但是 T.J. Crowder 下面的规范链接应该更精确,尽管很干。
  • @SpyrosMandekis:有规范。 :-) 从根本上说,如果您希望在调用函数时确定 this,则 bind 不是正确的工具,因为它预先确定了 this 的内容。


来源:https://www.codenong.com/29943717/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9855.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?