js(=>) Explicação detalhada da função de seta e coleção de casos

O padrão ES6 adiciona uma nova função: Arrow Function (função de seta).

Por que é chamado de função de seta? Porque sua definição usa uma seta:

x => x * x

A função de seta acima é equivalente a:

function (x) {
    return x * x;
}

As funções de seta são equivalentes a funções anônimas e simplificam as definições de função. Existem dois formatos para funções de seta, um é como o acima, que contém apenas uma expressão e até mesmo a soma { ... }é returnomitida. Existe outro que pode conter várias declarações, neste momento a soma não pode ser { ... }omitida return:

x => {
    if (x > 0) {
        return x * x;
    }
    else {
        return - x * x;
    }
}

Se o parâmetro não for um, ele precisa ser ()colocado entre parênteses:

// 两个参数:
(x, y) => x * x + y * y

// 无参数:
() => 3.14

// 可变参数:
(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}
 

Se você quiser retornar um objeto, preste atenção, se for uma única expressão, você receberá um erro se escrever assim:

// SyntaxError:
x => { foo: x }
因为和函数体的{ ... }有语法冲突,所以要改为:

// ok:
x => ({ foo: x })

esse

A função seta parece ser um atalho para a função anônima, mas, na verdade, há uma diferença óbvia entre a função seta e a função anônima: dentro da função seta está o escopo léxico, que é determinado pelo contexto this.

Olhando para o exemplo anterior, o exemplo a seguir não funciona como esperado devido ao tratamento incorreto de ligações da função JavaScript :this

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = function () {
            return new Date().getFullYear() - this.birth; // this指向window或undefined
        };
        return fn();
    }
};

As funções de seta agora corrigem totalmente thisos ponteiros thispara sempre apontar para o escopo léxico, que é o chamador externo obj:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
        return fn();
    }
};
obj.getAge(); // 25

Se você usar a função de seta, o método de escrita hack anterior:

var that = this;

Não é mais necessário.

Como thisa função de seta foi vinculada de acordo com o escopo léxico, ao usar call()ou apply()chamar a função de seta, ela não pode ser thisvinculada, ou seja, o primeiro parâmetro passado é ignorado:

var obj = {
    birth: 1990,
    getAge: function (year) {
        var b = this.birth; // 1990
        var fn = (y) => y - this.birth; // this.birth仍是1990
        return fn.call({birth:2000}, year);
    }
};
obj.getAge(2015); // 25

 

Acho que você gosta

Origin blog.csdn.net/tianhai110/article/details/86536043
Recomendado
Clasificación