javascript - this 与函数的强制绑定(bind)

标签 javascript jquery

我刚刚浏览了 jBox.js 的代码,发现了以下代码行:

jQuery(document).on('keyup.jBox-' + this.id, function(ev) {
    (ev.keyCode == 37) && this.showImage('prev');
    (ev.keyCode == 39) && this.showImage('next');
}.bind(this));

看看代码 HERE ,这家伙似乎强制将函数与 this 的值绑定(bind),我对这种模式有一些疑问。

  • 这是某种设计模式吗?

  • 作者试图通过将大多数方法与 this 绑定(bind)来实现什么目的?

  • 例如上面的代码片段,作者试图通过将函数与 this 绑定(bind)来实现什么目的。 (我的猜测是,bind 的功能与 jQuery 的 $.proxy 类似?在新函数定义中维护 this 的值。)。

最佳答案

在您显示的代码中,如果您删除了 .bind(this)调用,然后this keyup.jBox-内处理程序将被设置为触发事件的 DOM 节点。不过,作者显然想要 this等于 this是(可能是 jBox 实例?)在创建处理程序本身的位置。

我不知道我是否会认为这是一种“设计模式”,它只是一种语言功能,允许作者强制执行this正是他们想要的,无论函数本身是如何调用的。

My guess is bind is functioning similar to jQuerys $.proxy here?

是的,非常相似。

快速示例:

function Person(name) {
    this.name = name;
    this.greet = function() {
        console.log('Hello, my name is ' + this.name);
    };
};

var tenali = new Person('Tenali');
tenali.greet();
// > Hello, my name is Tenali

太好了,这有效,因为作为作者,我希望您始终以 <person-instance>.greet() 的形式访问它。 。但是,如果有人打破这个假设会发生什么:

var jeremy = new Person('Jeremy');
var greet = jeremy.greet;
greet();
// > Hello, my name is undefined

显然没有按预期工作,因为现在 greet()被作为普通的 ol' 函数调用,完全独立于 jeremy作为上下文目标(在 JavaScript 中通常通过用于调用方法的 . 符号来推断)。

现在,作为Person的消费者例如,您仍然可以强制 this成为jeremy再次使用 .call() .apply() :

var jeremy = new Person('Jeremy');
var greet = jeremy.greet;
greet.apply(jeremy);
// > Hello, my name is Jeremy

...这很好,但不太优雅。因此,为了让事情变得更轻松,我可以强制 this成为我想要的样子,如下所示:

function Person(name) {
    this.name = name;
    this.greet = function() {
        console.log('Hello, my name is ' + this.name);
    }.bind(this);
};

现在,如果我们回到前面的示例,我们将看到它按预期工作,因为我已经“绑定(bind)”了 greet()已将函数添加到 Person 实例:

var jeremy = new Person('Jeremy');
var greet = jeremy.greet;
greet();
// > Hello, my name is Jeremy

关于javascript - this 与函数的强制绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664218/

相关文章:

javascript - 过滤不是函数?

javascript - 在调整 Fabric.js 中基于文本的对象大小时,如何防止包含文本的垂直和水平拉伸(stretch)?

jquery - 创建具有等高图像列和可滚动列表组列的行

javascript - 我试图在页面加载时隐藏一个段落,然后执行显示/隐藏 jquery 并更改按钮名称 onclick

javascript - JQuery 幻灯片动画 + CSS

java - jqgrid解析器错误

javascript - EaselJS getObjectUnderPoint 和缩放 CSS 问题

javascript - 在不同的文件/函数中捕获 axios 请求

javascript - 在 NodeJs 中存储上次收到的 REST 调用的日期/时间

javascript - 将 jquery datepicker 绑定(bind)到动态行 Textfield