2016-05-22 3 views
0

Я даже не знаю, как это назвать, поэтому не уверен, как правильно задать вопрос. Что такое оператор и что он делает? Я предполагаю, что он просто передаёт выражение функции как обратный вызов, но синтаксис для меня новичок.Синтаксис Javascript. Что это: ", (err) => {}"?

(ERR) =>

fs.writeFile('message.txt', 'Hello Node.js', (err) => { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 
+0

ES5 новая функция стрелка синтаксиса проверить его здесь https://babeljs.io/repl/ –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Arrow_functions – Sirko

+0

Вы также можете опустить скобки о 'err':' err => console.error (err) ' –

ответ

5

Это так называемый arrow function. Это краткая форма для определения выражений функций. Следовательно,

fs.writeFile('message.txt', 'Hello Node.js', (err) => { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 

в основном аналогичен:

fs.writeFile('message.txt', 'Hello Node.js', function (err) { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 

Во всяком случае, есть большая разница bitween синтаксических: В то время как function создает новую область для this, функция стрелки повторно использует внешнюю сферу. Таким образом, в функции обратного вызова, определенном с помощью ключевого слова function вам может понадобиться что-то такое, как

const that = this; 

сохранить внешнюю сферу, используя функцию стрелков не нужно. Обратите внимание, что это также означает, что вы не можете использовать bind со стрелкой (т. Е. Невозможно переопределить this для функции стрелки (хорошо, правда, вы можете использовать, но первый параметр выиграл не имеет никакого эффекта)).

Кроме того, обратите внимание, что вы можете опустить круглые скобки вокруг параметра, если есть только один. Таким образом, вместо

fs.writeFile('message.txt', 'Hello Node.js', (err) => { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 

вы также можете написать:

fs.writeFile('message.txt', 'Hello Node.js', err => { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 

Во всяком случае, это работает только, если есть только один параметр.

0

Это функция стрелка (или лямбда) Синтаксис ES6 в. Выезд this MDN article.

Это действительно обратный вызов, который примет аргумент с именем err.

В вашем случае это семантически эквивалентно следующему:

function(err) { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
} 
+3

Это семантически ** не ** эквивалентно. Функции стрелок по-разному имеют дело с этим. –

+0

... и переменные с функциональной областью не подходят для них. – metarmask

+1

Вупс, ты прав. Я не буду вдаваться в подробности, но отредактировал свой ответ, чтобы указать, что он эквивалентен только в этом конкретном случае. – Aaron

Смежные вопросы