mirror of
https://git.proxmox.com/git/pve-eslint
synced 2025-10-06 02:14:51 +00:00

includes a (minimal) working wrapper Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
87 lines
2.5 KiB
Markdown
87 lines
2.5 KiB
Markdown
# Disallow unnecessary function binding (no-extra-bind)
|
|
|
|
The `bind()` method is used to create functions with specific `this` values and, optionally, binds arguments to specific values. When used to specify the value of `this`, it's important that the function actually uses `this` in its function body. For example:
|
|
|
|
```js
|
|
var boundGetName = (function getName() {
|
|
return this.name;
|
|
}).bind({ name: "ESLint" });
|
|
|
|
console.log(boundGetName()); // "ESLint"
|
|
```
|
|
|
|
This code is an example of a good use of `bind()` for setting the value of `this`.
|
|
|
|
Sometimes during the course of code maintenance, the `this` value is removed from the function body. In that case, you can end up with a call to `bind()` that doesn't accomplish anything:
|
|
|
|
```js
|
|
// useless bind
|
|
var boundGetName = (function getName() {
|
|
return "ESLint";
|
|
}).bind({ name: "ESLint" });
|
|
|
|
console.log(boundGetName()); // "ESLint"
|
|
```
|
|
|
|
In this code, the reference to `this` has been removed but `bind()` is still used. In this case, the `bind()` is unnecessary overhead (and a performance hit) and can be safely removed.
|
|
|
|
## Rule Details
|
|
|
|
This rule is aimed at avoiding the unnecessary use of `bind()` and as such will warn whenever an immediately-invoked function expression (IIFE) is using `bind()` and doesn't have an appropriate `this` value. This rule won't flag usage of `bind()` that includes function argument binding.
|
|
|
|
**Note:** Arrow functions can never have their `this` value set using `bind()`. This rule flags all uses of `bind()` with arrow functions as a problem
|
|
|
|
Examples of **incorrect** code for this rule:
|
|
|
|
```js
|
|
/*eslint no-extra-bind: "error"*/
|
|
/*eslint-env es6*/
|
|
|
|
var x = function () {
|
|
foo();
|
|
}.bind(bar);
|
|
|
|
var x = (() => {
|
|
foo();
|
|
}).bind(bar);
|
|
|
|
var x = (() => {
|
|
this.foo();
|
|
}).bind(bar);
|
|
|
|
var x = function () {
|
|
(function () {
|
|
this.foo();
|
|
}());
|
|
}.bind(bar);
|
|
|
|
var x = function () {
|
|
function foo() {
|
|
this.bar();
|
|
}
|
|
}.bind(baz);
|
|
```
|
|
|
|
Examples of **correct** code for this rule:
|
|
|
|
```js
|
|
/*eslint no-extra-bind: "error"*/
|
|
|
|
var x = function () {
|
|
this.foo();
|
|
}.bind(bar);
|
|
|
|
var x = function (a) {
|
|
return a + 1;
|
|
}.bind(foo, bar);
|
|
```
|
|
|
|
## When Not To Use It
|
|
|
|
If you are not concerned about unnecessary calls to `bind()`, you can safely disable this rule.
|
|
|
|
## Further Reading
|
|
|
|
* [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
|
|
* [Understanding JavaScript's Function.prototype.bind](https://www.smashingmagazine.com/2014/01/understanding-javascript-function-prototype-bind/)
|