Обмен технологиями

Продвинутое программирование на JavaScript (четвертое издание) — изучение функций записи (часть 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

функция

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

Декларативное определение функции

  1. function sum (n1,n2){
  2. return n1+n2;
  3. }

Функциональное выражение определения функции

  1. let sum = function(n1,n2){
  2. return n1+n2;
  3. };

Функция стрелки определения функции

  1. let sum = (n1,n2)=>{
  2. return n1+n2;
  3. };

конструктор определения функции

  1. let sum = new Function("n1","n2","return n1+n2");
  2. /*这个构造函数接收任意多个字符串参数,
  3. 最后一个参数始终会被当成函数体,
  4. 而之前的参数都是新函数的参数*/

функция стрелки

Стрелочные функции можно использовать везде, где можно использовать функциональное выражение.

  1. let sum = (a,b)=>{
  2. return a+b;
  3. };
  4. let sum1 = function(a,b){
  5. return a+b;
  6. };
  7. //箭头函数适合嵌入函数的场景
  8. let arr = [1,2,3];
  9. console.log(arr.map(function(i) {return i+1;}));
  10. console.log(arr.map((i)=>{return i+1;}));
  11. //二者结果一样,但是箭头函数更为简洁
  12. //如果只有一个参数,括号可以不用。只有没有参数,或者多个参数的情况下,才使用括号
  13. let double = (x)=>{return 2*x;};
  14. let triple = x => {return 3*x};
  15. //箭头函数也可以不使用大括号,但这样会改变函数的行为。使用大括号就说明包含函数体,可以在一
  16. //个函数中包含多条语句,跟常规函数一样。如果不使用,后面只能有一行代码。
  17. let double = (x)=>{return 2*x;};
  18. let triple = x=>3*x;

Хотя стрелочные функции имеют простой синтаксис, во многих ситуациях они не подходят. Стрелочные функции не могут использовать аргументы, super, new.target и не могут использоваться в качестве конструкторов. Кроме того, стрелочные функции не имеют атрибута прототипа.

Параметры в стрелочных функциях

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

  1. function foo() {
  2. console.log(arguments[0]);
  3. }
  4. foo(5); // 5
  5. let bar = () => {
  6. console.log(arguments[0]);
  7. };
  8. bar(5); // ReferenceError: arguments is not defined

Имя функции

Функция может иметь несколько имен.

  1. function sum(num1, num2) {
  2. return num1 + num2;
  3. }
  4. console.log(sum(10, 10)); // 20
  5. let anotherSum = sum;
  6. console.log(anotherSum(10, 10)); // 20
  7. sum = null;
  8. console.log(anotherSum(10, 10)); // 20

Значение параметра по умолчанию

Вы можете присвоить параметру значение по умолчанию, используя = после параметра в определении функции.

  1. function makeKing(name = 'Henry') {
  2. return `King ${name} VIII`;
  3. }
  4. console.log(makeKing('Louis')); // 'King Louis VIII'
  5. console.log(makeKing()); // 'King Henry VIII'

Значения параметров по умолчанию не ограничиваются примитивными значениями или типами объектов, также можно использовать значения, возвращаемые вызывающей функцией.

  1. let romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI'];
  2. let ordinality = 0;
  3. function getNumerals() {
  4. // 每次调用后递增
  5. return romanNumerals[ordinality++];
  6. }
  7. function makeKing(name = 'Henry', numerals = getNumerals()) {
  8. return `King ${name} ${numerals}`;
  9. }
  10. console.log(makeKing()); // 'King Henry I'
  11. console.log(makeKing('Louis', 'XVI')); // 'King Louis XVI'
  12. console.log(makeKing()); // 'King Henry II'
  13. console.log(makeKing()); // 'King Henry III'

Расширение и сбор параметров

ES6 добавляет новый оператор расширения, который можно использовать для очень краткой обработки и объединения данных сбора. Наиболее полезным сценарием для оператора расширения является список параметров в определении функции, где он может в полной мере использовать преимущества слабой типизации и параметров переменной длины языка. Оператор расширения можно использовать для передачи параметров при вызове функции или для определения параметров функции.

Расширенные параметры

  1. let values = [1, 2, 3, 4];
  2. function getSum() {
  3. let sum = 0;
  4. for (let i = 0; i < arguments.length; ++i) {
  5. sum += arguments[i];
  6. }
  7. return sum;
  8. }
  9. //不使用扩展操作符实现累加
  10. console.log(getSum.apply(null,values));
  11. //使用扩展操作符
  12. console.log(getSum(...values));

Сбор параметров

Если перед собираемыми параметрами стоят именованные параметры, будут собраны только остальные параметры, в противном случае будет получен пустой массив; Поскольку результат сбора параметров является переменным, его можно использовать только в качестве последнего параметра.

  1. function getProduct(...values,lastValue){}//不可以
  2. function ignoreFirst(firstValue,...values){console.log(values)}//可以
  3. ignoreFirst(); // []
  4. ignoreFirst(1); // []
  5. ignoreFirst(1,2); // [2]
  6. ignoreFirst(1,2,3); // [2, 3]

Объявление функции и выражение функции

Прежде чем какой-либо код будет выполнен, механизм JavaScript считывает объявление функции и генерирует определение функции в контексте выполнения. Выражение функции должно дождаться выполнения кода до своей строки, прежде чем определение функции будет сгенерировано в контексте выполнения.
  1. // 没问题
  2. console.log(sum(10, 10));
  3. function sum(num1, num2) {
  4. return num1 + num2;
  5. }
  6. /*函数声明提升*/
  7. // 会出错
  8. console.log(sum(10, 10));
  9. let sum = function(num1, num2) {
  10. return num1 + num2;
  11. };