对其他答案不满意。截至 2019 年 3 月 2013 年投票最高的答案实际上是错误的。
=> 的简短版本是编写一个函数 AND 将其绑定到当前 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 中的含义有关。
ALL 函数有一个名为 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)的快捷方式