我一直在尝试使用ES6一段时间了,我只是遇到了一个小问题。
我真的很喜欢使用箭头功能,只要我能,我就会使用它们。
然而,似乎你无法绑定它们!
这是功能:
var f = () => console.log(this);
这是我想将函数绑定到的对象:
var o = {'a': 42};
以下是我如何将f
绑定到o
:
var fBound = f.bind(o);
然后我可以致电fBound
:
fBound();
将输出此(o
对象):
{'a': 42}
酷!可爱!除了它不起作用。它不输出o
对象,而是输出window
对象。
所以我想知道:你能绑定箭头功能吗? (如果是这样,怎么样?)
我在Google Chrome 48和Firefox 43中测试了上面的代码,结果是一样的。
答案 0 :(得分:104)
你不能"重新绑定"箭头功能。它将始终使用定义它的上下文进行调用。只需使用正常功能。
对ArrowFunction中的arguments,super,this或new.target的任何引用都必须解析为词法封闭环境中的绑定。通常,这将是一个直接封闭函数的函数环境。
答案 1 :(得分:27)
要完成,您可以重新绑定箭头功能,您无法更改this
的含义。
bind
仍然具有函数参数的值:
((a, b, c) => {
console.info(a, b, c) // 1, 2, 3
}).bind(undefined, 1, 2, 3)()
答案 2 :(得分:9)
来自MDN:
与函数表达式相比,箭头函数表达式具有更短的语法,并且词汇绑定此值(不绑定它自己的this,arguments,super或new.target)。箭头功能始终是匿名的。
这意味着您无法将值绑定到它。
答案 3 :(得分:8)
多年来,js开发人员在上下文绑定方面苦苦挣扎,询问javascript中this
为何发生了变化,多年来由于上下文绑定以及javascript中this
的含义与this
之间的差异而引起的混淆{1}}在大多数其他OOP语言中。{/ p>
这一切让我想问,为什么,为什么!为什么你不想重新加入箭头功能!专门用于解决所有这些问题和混淆的内容,避免使用bind
或call
或其他任何方式来保留函数的范围。
<强> TL; DR 强>
不,你不能重新绑定箭头功能。
答案 4 :(得分:3)
答案 5 :(得分:3)
Do ES6 Arrow Functions Really Solve “this” In JavaScript
以上链接说明,箭头功能score
不会随this
功能而改变。
用一个很好的例子来解释。
在bind, call, apply
中运行此命令以查看“预期”行为,
node v4
答案 6 :(得分:2)
var obj = {value: 10};
function arrowBind(fn, context) {
let arrowFn;
(function() {
arrowFn = eval(fn.toString());
arrowFn();
}).call(context);
}
arrowBind(() => {console.log(this)}, obj);
答案 7 :(得分:2)
简短,您不能绑定箭头功能,但请继续阅读:
想象一下,您有以下箭头功能,在其下方将在控制台上显示text = input('Enter a sentence: ')
def sponge(t):
new = ''
counter = 0
for i in t:
if counter % 2 == 0:
new += i.lower()
else:
new += i.upper()
counter += 1
return new
print(sponge(text))
:
this
为此,快速解决方案是使用常规功能,因此只需将其更改为:
const myFunc = ()=> console.log(this);
然后,您可以使用function myFunc() {console.log(this)};
或bind
或call
将其绑定到任何词法环境:
apply
,并在const bindedFunc = myFunc.bind(this);
的情况下调用它。
bind
还有使用bindedFunc();
进行操作的方法,强烈建议不推荐。
答案 8 :(得分:1)
我认为这是更好的解决方案
module.exports = mongoose.model("User", User)
答案 9 :(得分:0)
也许这个例子对您有帮助:
let bob = {
_name: "Bob",
_friends: ["stackoverflow"],
printFriends:(x)=> {
x._friends.forEach((f)=> {
console.log(x._name + " knows " + f);
});
}
}
bob.printFriends = (bob.printFriends).bind(null,bob);
bob.printFriends();
答案 10 :(得分:0)
常规绑定:
tag.on("Initialized", function(tag) {
nodeValueChanged(tag, currentNode)
}.bind(currentNode))
箭头函数绑定:
tag.on("Initialized", (tag => { nodeValueChanged(tag, currentNode) }).bind(currentNode))
答案 11 :(得分:0)
箭头函数总是有 this
基于其最接近的非箭头函数,而不管它在哪里被调用。如果没有非箭头父对象,它总是指向全局对象。