你能绑定箭头功能吗?

时间:2015-10-23 17:22:36

标签: javascript function ecmascript-6

我一直在尝试使用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中测试了上面的代码,结果是一样的。

12 个答案:

答案 0 :(得分:104)

你不能"重新绑定"箭头功能。它将始终使用定义它的上下文进行调用。只需使用正常功能。

来自ECMAScript 2015 Spec

  

对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)()

在这里试试: http://jsbin.com/motihanopi/edit?js,console

答案 2 :(得分:9)

来自MDN

  

与函数表达式相比,箭头函数表达式具有更短的语法,并且词汇绑定此值(不绑定它自己的this,arguments,super或new.target)。箭头功能始终是匿名的。

这意味着您无法将值绑定到它。

答案 3 :(得分:8)

多年来,js开发人员在上下文绑定方面苦苦挣扎,询问javascript中this为何发生了变化,多年来由于上下文绑定以及javascript中this的含义与this之间的差异而引起的混淆{1}}在大多数其他OOP语言中。{/ p>

这一切让我想问,为什么,为什么!为什么你不想重新加入箭头功能!专门用于解决所有这些问题和混淆的内容,避免使用bindcall或其他任何方式来保留函数的范围。

<强> TL; DR

不,你不能重新绑定箭头功能。

答案 4 :(得分:3)

我几天前问了同样的问题。

您无法绑定值,因为this已绑定。

Binding different this scope to ES6 => function operator

答案 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)}; bindcall将其绑定到任何词法环境:

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 基于其最接近的非箭头函数,而不管它在哪里被调用。如果没有非箭头父对象,它总是指向全局对象。