Когда использовать функцию сразит стрелой (arrow function) вместо общей функции?

Когда использовать функцию сразит стрелой в языке сценариев JavaScript?

() => { console.log('test'); }

function() { console.log('test'); } 
30
задан 24.06.2019, 18:38
2 ответа

Этот новый синтаксис для функций, введенный в ES6 функционально эквивалентный нормальным функциям по большинству ситуаций, однако важно замечать следующие различия:

  • Стоимость this, нормальные функции захватывают стоимость this как глобальный объект (или undefined в строгом способе):

    function Persona() {            
        this.edad = 0;
    
        setInterval(function crecer() {    
            this.edad++; // error lógico, no se refieren a la misma variable
        }, 1000);
    }
    

    В то время как он сразит стрелой функции они захватывают эту стоимость внешнего немедленного scope:

    function Persona(){
        this.edad = 0;
    
        setInterval(() => {
            this.edad++; // correcto, this se refiere a una instancia de Persona
        }, 1000);
    }
    
  • Аргументы, нормальные функции имеют доступ к специальной так называемой переменной arguments что сходный с договоренностью и содержит ссылки на аргументы, которые проходят в функцию:

    function foo(arg1, arg2) {
        console.log(arguments[0]);
    }
    
    foo("hola", "mundo"); // imprime "hola"
    

    В функциях срази стрелой, arguments он относится к переменной во внешнем scope, если изменчивая не существует, Ваша стоимость undefined:

    var arguments = 42;
    var arr = () => arguments;
    
    arr(); // 42
    

    Несмотря на это, возможно осуществлять сходную функциональность с параметрами rest:

    var foo = (...args) => {console.log(args[0])};
    foo("hola", "mundo"); // Imprime "hola"
    
  • Если функция стрелы просто возвращает единственную линию кода, смоги опускать квадратные скобки заявления и ключевого слова return. Он говорит это ему в функцию стрелы, чтобы он возвратил заявление.

    const double = (num) => num * 2;
    
  • Keyword yield, это размещенное слово было введено также в ES6 и использована в порождающих функциях, однако не может быть использованной в функциях стрела.

Функции срази стрелой они предоставляют более элегантный и компактный синтаксис, будучи использованы, как callbacks, которым они могут быть использованными почти в тех же ситуациях, что и нормальные функции, и вероятно они будут предпочтены в будущих версиях EcmaScript, только нужно принимать во внимание предыдущие различия, чтобы не совершать ошибки.

30
ответ дан 03.12.2019, 23:16

Функции срази стрелой или Арров Функтионс не являются одинокими сахар синтаксическая, чтобы делать более легким / элегантным заявление обычной функции. Есть значительные различия между обоими, которые могут способствовать тому, чтобы программа не функционировала, как ожидается он и они не являются взаимозаменяемыми для многих случаев.

Поэтому я предполагаю, что полный вопрос: когда использовать их, и когда нет?

Когда использовать Арров Функтионс?

Ограниченный синтаксис чистых функций.

В следующем блоке, они взаимозаменяемые, из-за которого это чистые функции (что Ваш результат не зависит от внешней переменной). В, когда выступление, они практически равны.

// declaracion de funcion 
var nombres = personas.map(function(p){ return p.nombre });
// funcion flecha, este es un buen caso de uso
var nombres = personas.map(p => p.nombre);

Когда quires, который функция сразит стрелой, будет работать в том же lexical scope, что и функция contenedora:

Функции срази стрелой они оцениваются как часть lexical scope, который содержит их, поэтому this и arguments это не инстанции, свойственные функции срази стрелой но это инстанции функции contenedora. Этот тип функций они не являются взаимозаменяемыми, ты будешь должен повторно писать части тела функции, если ты захочешь изменить другой синтаксис.

Считай этот другой блок:

// ECMAScript 5, usando una declaración de función.
function contadorDeSegundos() {
  var that = this;
  this.contar = 0;
  setInterval(function() {
    that.contar++;
  }, 1000);
}

///  ECMAScript 2015, con arrow functions
function contadorDeSegundos() {
  this.contar = 0;                      
  setInterval(() => { this.contar++ }, 1000); 
}

Поскольку ты видишь здесь снова код, он компактнее, но поведение this он очень различный.

Когда не использовать Арров Функтионс?

Когда ты будешь нуждаться в динамических аргументах:

Поскольку уже он установился, функции срази стрелой они не выставляют объект arguments, следовательно, если ты нуждаешься в доступе к тому же самому, ты не можешь использовать их. Имей в виду, что, если функция сразит стрелой, ты объявляешь ее внутри другой функции, ты соглашался бы в arguments функции contenedora (если была одна). Поэтому говорят, что он сразит стрелой функции, они используют lexical arguments. А именно, что видят объект arguments что находится в lexical scope.

Во всем мире:

var f = () => { console.log(arguments.length) }
f();
// produce: Uncaught ReferenceError: arguments is not defined(…)
var f2 = function() { console.log(arguments.length) }
f2();
// produce: 0

В функциях генератор:

Ключевое слово yield не позволена в функциях стрела. Эти функции не могут быть функциями генератором (однако могут содержать функции генератор).

11
ответ дан 03.12.2019, 23:16
  • 1
    Другой случай, где они не должны быть использованными, - в añ adir mé все в объект или Ваш прототип: obj.metodo=()=>{ this. ...} fallará потому что this когда бы то ни было será ожидаемый объект – Pablo Lozano 15.05.2018, 14:07

Теги

Похожие вопросы