- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
ES2015 中的箭头函数提供了更简洁的语法。
function User(name) {
this.name = name;
}
// vs
const User = name => {
this.name = name;
};
User.prototype.getName = function() {
return this.name;
};
// vs
User.prototype.getName = () => this.name;
const obj = {
getName: function() {
// ...
}
};
// vs
const obj = {
getName: () => {
// ...
}
};
setTimeout(function() {
// ...
}, 500);
// vs
setTimeout(() => {
// ...
}, 500);
function sum() {
let args = [].slice.call(arguments);
// ...
}
// vs
const sum = (...args) => {
// ...
};
最佳答案
tl;博士: 不! 箭头函数和函数声明/表达式不是等价的,不能盲目替换。
如果要替换的函数不使用this
, arguments
并且不是用 new
调用的, 好的。
像往常一样:看情况 .箭头函数与函数声明/表达式有不同的行为,所以让我们先看看它们的区别:
1.词法this
和 arguments
箭头函数没有自己的 this
或 arguments
捆绑。相反,这些标识符像任何其他变量一样在词法范围内解析。这意味着在箭头函数内部,this
和 arguments
引用 this
的值和 arguments
在环境中,箭头函数定义在(即箭头函数的“外部”):
// Example using a function expression
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: function() {
console.log('Inside `bar`:', this.foo);
},
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
// Example using a arrow function
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
this
指的是在
createObject
中创建的对象.在箭头函数的情况下,
this
指
this
的
createObject
本身。
this
,这使得箭头函数很有用。当前环境:
// currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
备注 这也意味着无法设置箭头函数的
this
与
.bind
或
.call
.
this
,考虑阅读
new
调用
new
调用它,即
new User()
.如果一个函数是可调用的,它可以在没有
new
的情况下被调用(即正常的函数调用)。
class
构造函数只能构造。
this
或 arguments
. .bind(this)
一起使用的函数this
)arguments
(见下文))function*
符号new
调用箭头函数.继续使用函数声明/表达式或使用
class
.
this
访问实例。如果他们不使用
this
,然后就可以更换了。但是,如果您主要关心简洁的语法,请使用
class
以其简洁的方法语法:
class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
对象方法
this
引用对象本身,继续使用函数表达式,或使用新的方法语法:
const obj = {
getName() {
// ...
},
};
回电
this
取别名,您一定要更换它。或正在使用
.bind(this)
:
// old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
但是:如果调用回调的代码显式设置
this
到一个特定的值,这是事件处理程序的常见情况,尤其是 jQuery,并且回调使用
this
(或
arguments
),您不能使用箭头功能!
arguments
,您不能简单地用箭头函数替换它们。但是,ES2015 引入了使用
arguments
的替代方法。 :
rest parameter .
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
关于javascript - 'Arrow Functions' 和 'Functions' 是否等效/可互换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34361379/
我尝试使用 graphviz 包中的 dot 为 MPLUS 分析创建图表。有没有人有使用 dot 来可视化结构方程模型/潜在类混合模型的经验?特别是有一个功能我无法弄清楚如何漂亮地做: 我需要从节点
我有一个文本框,在它下面有一个列表框。 当用户在文本框中输入时,如果他按下向上或向下箭头,他应该在列表框中进行选择。文本框检测到所有字符(空格除外),但似乎无法检测到箭头按下。 有什么解决办法吗?顺便
我有一个大数据集并试图绘制 PCA。我对最终的情节相当满意,但我想改变一些事情: 箭头:它们似乎在背景中并被数据点覆盖。1)我怎样才能把它们放在前面?2)如何更改颜色和喜欢的大小? 省略号:3) 如何
我需要做的是找到一个向上箭头字符并将其替换为向上箭头形状,并对向下箭头执行相同的操作。我是 VBA 的新手,但对我希望宏如何工作有一个想法。它应该循环遍历 powerpoint 上的所有幻灯片。 1)
我需要做的是找到一个向上箭头字符并将其替换为向上箭头形状,并对向下箭头执行相同的操作。我是 VBA 的新手,但对我希望宏如何工作有一个想法。它应该循环遍历 powerpoint 上的所有幻灯片。 1)
很抱歉提出这样一个基本问题,但我需要知道当我将鼠标悬停在 #leaderboard 上时如何向两个 div 添加类,#left-arrow 和 #right-arrow。 我知道我可以使用调用悬停()
这样的代码会产生一个错误: if(hr>t1[0]||(hr==t1[0]&&min=>t1[1]) && hr=而不是=引起的。但我仍然很好奇为什么错误是这样表述的,以及箭头函数应该是什么。 编辑
我有一个针对 Apache Arrow C++ 库构建的 C++ 库,使用 Pybind 绑定(bind)到 python。我希望能够用 C++ 编写一个函数来获取用 PyArrow 构造的表,例如:
介绍 Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块A
非常基本的问题: 我如何知道端口/信号/值应该放在箭头的哪一侧?我注意到通过切换 port_a => x至x port_a不工作 我什至不知道箭头应该指向哪个方向。 非常感谢您的回答! 最佳答案 是
由于输入无效,箭头会引发ParserError: >>> arrow.get('abc') ParserError: Could not match input to any of [u'YYYY-M
IE9 有这个可笑的蓝色箭头,只要浏览器窗口有选择,它就会呈现: 无论是用户做出选择还是通过 JavaScript 以编程方式进行选择(如我的情况),都会发生这种情况。是否有可能不显示此蓝色箭头? 最
如何让 Arrow 返回两个时间戳之间的小时差? 这是我所拥有的: difference = arrow.now() - arrow.get(p.create_time()) print(differ
我正在使用 Raphaël 库来创建一个快速绘图工具。 但是箭头末端有一个错误,它们为所有行分配了相同的值。 说,我有一个带有#raphael-marker-oval 箭头的 lineA。然后,我绘制
sequenceA是一个众所周知的函数: sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a) 我想知道我们是否可以为 A
如果要使用箭头/箭头功能之一绘制箭头而不是轴线,如何显示线/箭头?下面的例子: import matplotlib.pyplot as plt import matplotlib.patches as
我最近一直在使用 kotlin arrow,但遇到了一个让我陷入困境的特定用例。 假设我有一些对象的集合,我想使用转换函数将其转换为另一种数据类型。假设这个 convert 函数有失败的能力——但它不
我继承了一个怪物。 它伪装成 .NET 1.1 应用程序处理符合医疗保健 claim 支付 (ANSI 835) 标准的文本文件,但它是一个怪物。正在处理的信息涉及医疗保健 claim 、EOB 和报
我有一个庞大的数据集,正在使用 Apache Spark 进行数据处理。 使用 Apache Arrow,我们可以将兼容 Spark 的数据帧转换为兼容 Pandas 的数据帧并在其上运行操作。
我在哪里可以找到隐藏在语言 pragma 后面的源代码 {-# LANGUAGE Arrows #-} 我已经阅读了相关的论文(如 Paterson, A New Notation for Arrow
我是一名优秀的程序员,十分优秀!