Когда использовать функцию сразит стрелой в языке сценариев JavaScript?
() => { console.log('test'); }
function() { console.log('test'); }
Этот новый синтаксис для функций, введенный в 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, только нужно принимать во внимание предыдущие различия, чтобы не совершать ошибки.
Функции срази стрелой или Арров Функтионс не являются одинокими сахар синтаксическая, чтобы делать более легким / элегантным заявление обычной функции. Есть значительные различия между обоими, которые могут способствовать тому, чтобы программа не функционировала, как ожидается он и они не являются взаимозаменяемыми для многих случаев.
Поэтому я предполагаю, что полный вопрос: когда использовать их, и когда нет?
В следующем блоке, они взаимозаменяемые, из-за которого это чистые функции (что Ваш результат не зависит от внешней переменной). В, когда выступление, они практически равны.
// 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);
Функции срази стрелой они оцениваются как часть 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
не позволена в функциях стрела. Эти функции не могут быть функциями генератором (однако могут содержать функции генератор).
obj.metodo=()=>{ this. ...}
fallará потому что this
когда бы то ни было será ожидаемый объект
– Pablo Lozano
15.05.2018, 14:07