适当使用Javascript的bind()

时间:2015-12-23 19:35:52

标签: javascript this

我看过JavaScript的bind方法,我不确定在哪种情况下我应该使用它。以下从卡片组(阵列)中获取随机卡的示例是否适合使用该方法:

function getRandomElementFromArray () {
    return this.splice( Math.floor( Math.random() * this.length ) )[0];
}

var deckOfCards = // Array of 52 cards;

var getRandomCard = getRandomElementFromArray.bind(deckOfCards);

3 个答案:

答案 0 :(得分:1)

我不会说这是一个合适的用途 - 应该简单地将牌组作为参数传递。

.bind最常见的用途是专门附加给定的this ,否则无法传递和/或创建一个函数,其中初始参数是固定的,然后传递额外的参数,例如

对于前者:

function MyObject() {
    this.callback = function() { ... }
}

var myobj = new MyObject();
el.addEventListener("click", myobj.callback.bind(myobj));

[没有.bind调用,回调将无法正确引用this

对于后者:

function add(a, b) { return a + b }
var add2 = add.bind(null, 2);   // no "this" needed in this case
add2(3);                        // returns 5

答案 1 :(得分:0)

没有。它只应在有对象时在OOP中使用,并且需要将一个方法从其prototype传递给另一个函数。在其他情况下,它通常没有意义。

function  MyClass() {
  this.name = 'foo';
}
MyClass.prototype.myMethod = function() { return this.name; }

var myObj = new MyClass();
// say we need to pass myObj.myMethod somewhere else

var func = myObj.myMethod;
func(); // undefined -- doesn't work.

var func2 = myObj.myMethod.bind(myObj);
func2(); // 'foo' -- works!

答案 2 :(得分:0)

当你谈到“适当”时,你必须更加具体。我认为可以通过查看一些样式或常规来回答你的问题。我已经查找了一个解释它非常自我的人:

  

Javascript的一个缺点是回调函数没有绑定到正确或预期的上下文(用this变量引用)。在ES2015中,通过使用所谓的回调箭头函数解决了这个问题。

     

然而,虽然我们仍在编写ES5代码,但我们可以使用.bind   将正确的此上下文绑定到回调方法的方法。

     

例如:

this.$el = $("#some-element");
setTimeout(function () {
    // Without using .bind, "this" will refer to the window object.
    this.$el.hide();
}.bind(this), 1000);

这是由Plone(内容管理系统)编写的样式指南,他可以从与谷歌或其他公司不同的角度来看待这个问题。这就是为什么你必须在你的背景下决定它是否“合适”。

指向样式指南的链接:Plone Styleguide