Предыдущие слова
Параметры функций JavaScript отличаются от параметров функций на большинстве других языков. Функции не возражают против того, сколько параметров передается, и при этом они не заботятся о типе данных о передаваемых параметрах, и они даже не могут передавать параметры.
аргументы
Определение функции в JavaScript не указывает тип параметров функции, и функциональный вызов не выполняет какую -либо проверку типа на значениях пропущенных параметров. Фактически, вызовы функций JavaScript даже не проверяют количество входящих формальных параметров.
Функция добавить (x) {return x+1;} console.log (add (1)); // 2console.log (add ('1')); // '11'console.log (add ()); // nanconsole.log (add (1,2)); // 2Формальные параметры с тем же именем
В безложном режиме формальный параметр с тем же именем может отображаться в функции, и только последний формальный параметр появляющегося имени можно получить
Функция добавить (x, x, x) {return x;} console.log (add (1,2,3)); // 3В строгом режиме синтаксическая ошибка возникает, когда одно и то же имя участвует в ошибке синтаксиса.
Функция add (x, x, x) {'используйте strict'; return x;} console.log (add (1,2,3)); // syntaxError: дубликат Имя параметра не разрешено в этом контекстеКоличество параметров
Когда указанное количество формальных параметров, объявленных реальной эталонной функцией.
Функция добавить (x, y) {console.log (x, y); // 1 undefined} add (1);Часто используйте логику или операторы, чтобы установить разумное значение по умолчанию для пропущенных параметров
Функция добавить (x, y) {y = y || 2; console.log (x, y); // 1 2} add (1);[Примечание] Фактически, используя y || 2 не является строгим, явно настраивая ложные значения (неопределенные, нулевые, ложные, 0, -0, '', NAN) также получит тот же результат. Следовательно, это должно быть установлено разумно на основе фактического сценария
Когда есть много реальных аргументов, оставшиеся реальные аргументы не могут быть получены напрямую. Вам нужно использовать объект аргументов, упомянутый в ближайшее время.
Параметры в JavaScript внутренне представлены массивом. Функция всегда получает этот массив и не заботится о том, какие параметры содержатся в массиве. Эта массива параметров можно получить через объект аргументов в корпусе функции, тем самым получая каждый параметр, передаваемый в функцию. Объект аргументов не является экземпляром массива, это объект массива, который может получить доступ к каждому его элементу, используя синтаксис квадратных кронштейнов.
Функция добавить (x) {console.log (аргументы [0], аргументы [1], аргументы [2]) // 1 2 3 Return x+1;} add (1,2,3);Атрибут длины объекта аргументов показывает количество реальных параметров, а атрибут длины функции показывает количество формальных параметров
Функция add (x, y) {console.log (arguments.length) // 3return x+1;} add (1,2,3); console.log (add.length); // 2Формальные параметры являются только удобными, но не обязательными
Функция add () {return Arguments [0] + Arguments [1];} console.log (add (1,2)); // 3Параметры объекта
Когда функция содержит более 3 формальных параметров, это действительно головная боль, чтобы помнить, что правильный порядок фактических параметров в функции называется.
Функция Arraycopy (/*Array*/from,/*index*/form_start,/*array*/to,/*index*/to_start,/*integer*/length) {// todo}Передайте параметры в форме пар/значения, поэтому порядок параметров не имеет значения. При определении функции передача в реальных параметрах записывается в отдельный объект. Объект передается при вызове. Пары имени/значения в объекте - это реальные данные, которые действительно необходимы.
function easyCopy (args) {arraycopy (args.from, args.form_start || 0, args.to, args.to_start || 0, args.length);} var a = [1,2,3,4], b = []; EasyCopy ({форма: a, to: b, длина: 4});синхронно
Когда количество фактических параметров формы, участвующей в одной и той же форме, значение объекта аргументов и значение соответствующих формальных параметров остается синхронизированным
Функциональный тест (num1, num2) {console.log (num1, аргументы [0]); // 1 1Arguments [0] = 2; console.log (num1, аргументы [0]); // 2 2num1 = 10; console.log (num1, аргументы [0]); // 10 10} тест (1);[Примечание] Хотя именованные параметры и соответствующее значение объекта аргументов одинаковы, они не являются тем же пространством имен. Их пространства имен независимы, но значения синхронны
Однако в строгом режиме значения объекта аргументов и значения формальных параметров являются независимыми
Функциональный тест (num1, num2) {'strict'; console.log (num1, arguments [0]); // 1 1 1Arguments [0] = 2; console.log (num1, аргументы [0]); // 1 2num1 = 10; console.log (num1, аргументы [0]); // 10 2} тест (1);Когда формальные параметры не имеют соответствующих фактических параметров, значение объекта аргументов не соответствует значению формальных параметров
Функциональный тест (num1, num2) {console.log (num1, аргументы [0]); // не определенное, undefinednum1 = 10; аргументы [0] = 5; console.log (num1, аргументы [0]); // 10,5} test ();Внутренние свойства
【Callee】
Объект Arguments имеет свойство, называемое Callee, которое является указателем на функцию, которая владеет объектом аргументов.
Ниже приведена классическая факторная функция
Функция Factorial (num) {if (num <= 1) {return 1;} else {return num* factorial (num-1);}} console.log (фактор (5)); // 120Тем не менее, выполнение вышеуказанной функции тесно связано с именем функции, и отделение функции может быть устранена с помощью Arguments.callee
Функция Factorial (num) {if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} console.log (фактор (5)); // 120Но в строгом режиме, доступ к этому свойству принесет ошибку TypeError
Функция факториала (num) {'strict'; if (num <= 1) {return 1;} else {return num* arguments.callee (num-1);}} // typeError: 'caller', «callee» и «Свойства аргументов» не могут быть доступны в строгих функциях или аргументах для вызовов для них.В настоящее время можно использовать выражение именованной функции
var Factorial = function fn (num) {if (num <= 1) {return 1;} else {return num*fn (num-1);}}; Консоль.log (фактор (5)); // 120【Абонент】
На самом деле есть два атрибута вызывающих абонента
【1】 Функциональный вызывающий абонент
Свойство вызывающего функции содержит ссылку на функцию, которая вызывает текущую функцию. Если текущая функция вызвана в глобальном объеме, ее значение равна нулю
function outter () {inner ();} function inner () {console.log (inner.caller); // outter () {inner ();}} outter (); function inner () {console.log (inner.caller); // null} inner ();В строгом режиме, доступ к этому свойству принесет ошибку TypeError
function inner () {'strict'; // typeerror: 'caller' и «аргументы» являются ограниченными свойствами функции и не могут быть доступны в этом контексте contextconsole.log (inner.caller);} inner ();【2】 Аргументы Объект вызывающего объекта
Это свойство всегда не определен. Это свойство определено, чтобы отличить свойства аргументов вызывающего абонента. Каллер и функция
функция inner (x) {console.log (arguments.caller); // не определен} inner (1);Точно так же, в строгом режиме, доступ к этому свойству принесет ошибку TypeError
Функция Inner (x) {'Использовать строгое'; // typeerror: «caller» и «аргументы» являются ограниченными свойствами функции и не могут быть доступны в этом контекстном порядке.Функция перегрузка
Функции JavaScript не могут реализовать перегрузку, как в традиционном смысле. На других языках могут быть написаны два определения для функции, если подписи этих двух определений (типы и величины принятых параметров) разные
Функция JavaScript не имеет подписи, поскольку ее параметры представлены массивом, содержащим 0 или более значений. Без функций подписей, реальная перегрузка невозможна
// Последующее объявление переопределяет предыдущая функция объявления addSomeNumber (num) {return num + 100;} функция addSomeNumber (num) {return num + 200;} var result = addSomeNumber (100); // 300Перегрузка методов может быть смоделирована только путем проверки типов и количества параметров в функции пропускания и создания различных реакций.
Функция doAdd () {if (arguments.length == 1) {alert (аргументы [0] + 10);} else if (arguments.length == 2) {alert (аргументы [0] + аргументы [1]);}} doAdd (10); // 20doadd (30,20); // 50} doAdd (10); // 20doadd (30,20); // 50Параметр проход
Все функции в JavaScript передаются по значению. То есть копирование значения вне функции в параметры внутри функции совпадает с тем, что копирование значения из одной переменной в другую
【1】 Основное значение типа
При передаче значения примитивного типа в параметр передаваемое значение копируется в локальную переменную (элемент именованного параметра или объекта аргументов)
Функция addten (num) {num += 10; return num;} var count = 20; var result = addten (count); console.log (count); // 20, без изменения console.log (result); // 30【2】 Значение типа ссылки
При передаче значения типа ссылки на параметр адрес этого значения в памяти будет скопирован в локальную переменную, поэтому изменение этой локальной переменной будет отражено вне функции
function setName (obj) {obj.name = 'test';} var person = new objКогда формальные параметры типа ссылки переопределены внутри функции, эта переменная относится к локальному объекту. Этот локальный объект будет уничтожен сразу после выполнения функции
function setName (obj) {obj.name = 'test'; console.log (person.name); // 'test'obj = new object (); obj.name =' white '; console.log (person.name); //' test '} var person = new object (); setName (человек);Выше приведено глубокое понимание параметров функции JavaScript, введенных редактором для вас (рекомендуется). Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!