2016-07-23 84 views
3

我碰到了这个ajax调用。这工作完全正常:什么是()=>运算符?

$.ajax({ 
    url: '/items/' + item.id, 
    method: 'PUT', 
    data: {item: item}, 
    success:() => { 
     this.updateItems(item); 
    } 
}); 

我没有得到什么() =>手段。我用成功:function(){ }但随后它给了我一个错误

“updateItems是不是一个函数”

+2

这被称为“箭头函数”,这是一种在es6中声明函数的新方法。 [Here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)是MDN文档,[here](http://stackoverflow.com/documentation/) javascript/186/functions#t = 201607230227390313154)是新的StackOverflow文档! –

+2

Tha是一个ES6 lambda函数。你得到一个正常函数错误的原因是因为在lambdas中,'this'具有不同的范围。 – VSG24

+0

感谢您的回复。仍然是一个问题。如果它的新方法声明函数,然后前进的方式功能(){}将无法正常工作? – user2015

回答

3

的结构被称为箭头功能。它已经与ES2015标准一起引入,其工作原理类似于function() {}语法。

欲了解更多信息,check the MDN docs

请注意,该语法尚未被所有浏览器支持,尤其是旧版本,因此您应该查看transpiling it into ES5 compliant JavaScript


之所以你试图把它改造成一个经典function() {}失败是经典的功能定义自己的this值,而箭头的功能使用周边功能的this值。这就是为什么this.updateItems无法找到。

要解决此问题,手动绑定功能方面:

$.ajax({ 
    url: '/items/' + item.id, 
    method: 'PUT', 
    data: {item: item}, 
    success: function() { 
     this.updateItems(item); 
    }.bind(this) 
}); 
+1

这是一个正确的答案,请回答OP关于他们收到的错误的问题。这是由于'this'如何使用箭头语法作用域/绑定的区别。 –

+0

@ this-vidor完成! :-) – Timo

+1

不错! (downvote不是我的。) –

0

这是一个Arrow功能,并且像一个匿名函数也结合this。当你将它切换到一个函数()时,this被绑定到其他东西,因此错误。

编辑:

如果你仍然想使用更传统的语法,然后使用:

function(){/*...*/}.bind(this) 

,这将确保你一定要正确的对象。

+0

**解释**区别! “别的东西”没有帮助。 –

+0

@ this-vidor我以为我做到了。他说错误的关键在于约束力的不同。 – seairth

+0

JavaScript是确定性的。在这种情况下,“别的东西”是一个非常具体的东西。当使用'function'语法时,'this'绑定了什么?你的编辑更有帮助,但仍然sl。。 –