对其他答案不满意。截至 2019 年 3 月 13 日,投票最高的答案实际上是错误的。
=> 的简短版本意味着它是编写函数的快捷方式和将其绑定到当前的this
const foo = a => a * 2;
实际上是一条捷径
const foo = function(a) { return a * 2; }.bind(this);
你可以看到所有被缩短的东西。我们不需要function,也不需要return,也不需要.bind(this),甚至不需要大括号或圆括号
一个稍长的箭头函数示例可能是
const foo = (width, height) => {
const area = width * height;
return area;
};
表明如果我们想要函数的多个参数,我们需要括号,如果我们想要写多个表达式,我们需要大括号和显式的return。
理解.bind 部分很重要,这是一个很大的话题。它与 this 在 JavaScript 中的含义有关。
全部函数有一个名为this 的隐式参数。调用函数时如何设置this取决于调用该函数的方式。
拿
function foo() { console.log(this); }
如果你正常打电话
function foo() { console.log(this); }
foo();
this 将是全局对象。
如果你处于严格模式
`use strict`;
function foo() { console.log(this); }
foo();
// or
function foo() {
`use strict`;
console.log(this);
}
foo();
它将是undefined
您可以直接使用call或apply设置this
function foo(msg) { console.log(msg, this); }
const obj1 = {abc: 123}
const obj2 = {def: 456}
foo.call(obj1, 'hello'); // prints Hello {abc: 123}
foo.apply(obj2, ['hi']); // prints Hi {def: 456}
您还可以使用点运算符 . 隐式设置 this
function foo(msg) { console.log(msg, this); }
const obj = {
abc: 123,
bar: foo,
}
obj.bar('Hola'); // prints Hola {abc:123, bar: f}
当您想将函数用作回调或侦听器时会出现问题。您创建了类并希望分配一个函数作为访问该类实例的回调。
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name); // won't work
});
}
}
上面的代码将不起作用,因为当元素触发事件并调用函数时,this 值将不是该类的实例。
解决该问题的一种常见方法是使用.bind
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name);
}.bind(this); // <=========== ADDED! ===========
}
}
因为箭头语法做同样的事情我们可以写
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click',() => {
console.log(this.name);
});
}
}
bind有效做一个新功能.如果 bind 不存在,你基本上可以像这样制作你自己的
function bind(functionToBind, valueToUseForThis) {
return function(...args) {
functionToBind.call(valueToUseForThis, ...args);
};
}
在没有传播运算符的旧 JavaScript 中,它将是
function bind(functionToBind, valueToUseForThis) {
return function() {
functionToBind.apply(valueToUseForThis, arguments);
};
}
理解该代码需要 an understanding of closures 但简短版本是 bind 创建一个新函数,该函数始终使用绑定到它的 this 值调用原始函数。箭头函数做同样的事情,因为它们是 bind(this) 的快捷方式