官术网_书友最值得收藏!

Arrow functions

One quirky, useful, but somewhat annoying aspect of ES5 JavaScript is its heavy use of callbacks that run asynchronously. You are probably intimately familiar with jQuery code that looks something like this:

$(“#link”).click(function() {
var $self = $(this);
doSomethingAsync(1000, function(resp) {
$self.addClass(“wasFaded”);
var processedItems = resp.map(function(item) {
return processItem(item);
});
return shipItems(processedItems);
});
});

We're forced to create a variable called $self because the original this context is lost in our inner anonymous function. We also have a lot of boilerplate and difficult-to-read code due to needing to create three separate anonymous functions.

Arrow function syntax is both syntactic sugar that helps us write anonymous functions with a shorter syntax, and also a functional update that preserves the context of this inside an arrow function.

For instance, the preceding code may be written in ES6 as follows:

$(“#link”).click(function() {
dozsSomethingAsync(1000, resp => {
$(this).addClass(“wasFaded”);
const processedItems = resp.map(item => processItem(Item));
return shipItems(processedItems);
});
});

You can see in the preceding code that we no longer need a $self variable to preserve this, and our call to .map is much simpler, no longer requiring the function keyword, parentheses, curly braces, or a return statement.

Now let's look at some equivalent functions. Let's look at the following code:

const double = function(number) {
return number * 2;
}

The preceding code would be similar to:

const double = number => number * 2;
// Is equal to:
const double = (number) => { return number * 2; }

In the aforementioned examples, we can omit the parentheses around the number parameter because the function only requires one parameter. If the function required two parameters, we would be required to add parentheses as in the next example. Additionally, if the body of our function only requires one line, we can omit the function body curly braces and omit the return statement.

Let's look at another equivalence, with multiple parameters, as shown in the following code:

const sorted = names.sort(function (a, b) {
return a.localeCompare(b);
});

The preceding code would be similar to:

const sorted = names.sort((a, b) => a.localeCompare(b));

I find that arrow functions make themselves most useful in situations like the preceding one, when you're doing data transformations, especially where using Array.map, Array.filter, Array.reduce, and Array.sort calls with straightforward function bodies. Arrow functions are less useful in jQuery because of jQuery's tendency to give you data using the this context, which you don't receive with anonymous arrow functions.

主站蜘蛛池模板: 汉寿县| 克山县| 邓州市| 曲麻莱县| 丰顺县| 平乡县| 桂平市| 固原市| 谷城县| 河源市| 马龙县| 岳普湖县| 包头市| 拉萨市| 五寨县| 开鲁县| 平湖市| 遂宁市| 泾阳县| 西青区| 望奎县| 偃师市| 新巴尔虎左旗| 荃湾区| 定州市| 康马县| 百色市| 吉林省| 西城区| 蓝田县| 南岸区| 江安县| 黄山市| 崇礼县| 西林县| 偏关县| 铜梁县| 通海县| 濮阳市| 东乡族自治县| 江城|