моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
функция
Каждая функция является экземпляром типа Function, и Function также имеет свойства и методы, как и другие ссылочные типы. Функции являются объектами, а имя функции является указателем на объект функции и не обязательно тесно связано с самой функцией.
Декларативное определение функции
function sum (n1,n2){ return n1+n2; }Функциональное выражение определения функции
let sum = function(n1,n2){ return n1+n2; };Функция стрелки определения функции
let sum = (n1,n2)=>{ return n1+n2; };конструктор определения функции
let sum = new Function("n1","n2","return n1+n2"); /*这个构造函数接收任意多个字符串参数, 最后一个参数始终会被当成函数体, 而之前的参数都是新函数的参数*/
функция стрелки
Стрелочные функции можно использовать везде, где можно использовать функциональное выражение.
let sum = (a,b)=>{ return a+b; }; let sum1 = function(a,b){ return a+b; }; //箭头函数适合嵌入函数的场景 let arr = [1,2,3]; console.log(arr.map(function(i) {return i+1;})); console.log(arr.map((i)=>{return i+1;})); //二者结果一样,但是箭头函数更为简洁 //如果只有一个参数,括号可以不用。只有没有参数,或者多个参数的情况下,才使用括号 let double = (x)=>{return 2*x;}; let triple = x => {return 3*x}; //箭头函数也可以不使用大括号,但这样会改变函数的行为。使用大括号就说明包含函数体,可以在一 //个函数中包含多条语句,跟常规函数一样。如果不使用,后面只能有一行代码。 let double = (x)=>{return 2*x;}; let triple = x=>3*x;Хотя стрелочные функции имеют простой синтаксис, во многих ситуациях они не подходят. Стрелочные функции не могут использовать аргументы, super, new.target и не могут использоваться в качестве конструкторов. Кроме того, стрелочные функции не имеют атрибута прототипа.
Параметры в стрелочных функциях
Функция определена с использованием синтаксиса стрелок, поэтому к параметрам, передаваемым в функцию, нельзя получить доступ с помощью ключевого слова аргументы, а можно получить доступ только через определенные именованные параметры.
function foo() { console.log(arguments[0]); } foo(5); // 5 let bar = () => { console.log(arguments[0]); }; bar(5); // ReferenceError: arguments is not defined
Имя функции
Функция может иметь несколько имен.
function sum(num1, num2) { return num1 + num2; } console.log(sum(10, 10)); // 20 let anotherSum = sum; console.log(anotherSum(10, 10)); // 20 sum = null; console.log(anotherSum(10, 10)); // 20
Значение параметра по умолчанию
Вы можете присвоить параметру значение по умолчанию, используя = после параметра в определении функции.
function makeKing(name = 'Henry') { return `King ${name} VIII`; } console.log(makeKing('Louis')); // 'King Louis VIII' console.log(makeKing()); // 'King Henry VIII'Значения параметров по умолчанию не ограничиваются примитивными значениями или типами объектов, также можно использовать значения, возвращаемые вызывающей функцией.
let romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI']; let ordinality = 0; function getNumerals() { // 每次调用后递增 return romanNumerals[ordinality++]; } function makeKing(name = 'Henry', numerals = getNumerals()) { return `King ${name} ${numerals}`; } console.log(makeKing()); // 'King Henry I' console.log(makeKing('Louis', 'XVI')); // 'King Louis XVI' console.log(makeKing()); // 'King Henry II' console.log(makeKing()); // 'King Henry III'
Расширение и сбор параметров
ES6 добавляет новый оператор расширения, который можно использовать для очень краткой обработки и объединения данных сбора. Наиболее полезным сценарием для оператора расширения является список параметров в определении функции, где он может в полной мере использовать преимущества слабой типизации и параметров переменной длины языка. Оператор расширения можно использовать для передачи параметров при вызове функции или для определения параметров функции.
Расширенные параметры
let values = [1, 2, 3, 4]; function getSum() { let sum = 0; for (let i = 0; i < arguments.length; ++i) { sum += arguments[i]; } return sum; } //不使用扩展操作符实现累加 console.log(getSum.apply(null,values)); //使用扩展操作符 console.log(getSum(...values));Сбор параметров
Если перед собираемыми параметрами стоят именованные параметры, будут собраны только остальные параметры, в противном случае будет получен пустой массив; Поскольку результат сбора параметров является переменным, его можно использовать только в качестве последнего параметра.
function getProduct(...values,lastValue){}//不可以 function ignoreFirst(firstValue,...values){console.log(values)}//可以 ignoreFirst(); // [] ignoreFirst(1); // [] ignoreFirst(1,2); // [2] ignoreFirst(1,2,3); // [2, 3]
Объявление функции и выражение функции
Прежде чем какой-либо код будет выполнен, механизм JavaScript считывает объявление функции и генерирует определение функции в контексте выполнения. Выражение функции должно дождаться выполнения кода до своей строки, прежде чем определение функции будет сгенерировано в контексте выполнения.
// 没问题 console.log(sum(10, 10)); function sum(num1, num2) { return num1 + num2; } /*函数声明提升*/ // 会出错 console.log(sum(10, 10)); let sum = function(num1, num2) { return num1 + num2; };