Каждая функция Javascript может получить доступ к специальной переменной - аргументы в рамках своей области. Эта переменная содержит список всех параметров, передаваемых функции.
Объект аргументов не является массивом. Хотя синтаксически он имеет то же место, что и массив, например, имеет свойство длины. Но это не унаследовано от массива. Прототип, на самом деле, это объект.
Следовательно, мы не можем напрямую использовать некоторые методы массива для аргументов, таких как Push, POP или SLICE и т. Д. Поэтому, чтобы использовать эти методы, нам необходимо преобразовать его в реальный массив.
Преобразовать в массив
Следующий код вернет массив, содержащий все элементы объекта аргументов.
Array.prototype.slice.call (аргументы);
Поскольку скорость конверсии очень медленная, это не рекомендуется в программах со строгими требованиями к производительности.
Передайте параметры
Вот более рекомендуемый метод передачи объекта аргументов от одной функции в другую.
Кода -копия выглядит следующим образом:
функция foo () {
bar.apply (null, аргументы);
}
Функциональная панель (A, B, C) {
// делать что -то здесь
}
Существует еще один умный метод, который должен быстро создать наружный метод, используя вызов и применить одновременно.
Кода -копия выглядит следующим образом:
функция foo () {}
Foo.prototype.method = function (a, b, c) {
console.log (это, A, B, C);
};
// Создать несвязанную версию «метода»
// это принимает параметры: это, arg1, arg2 ... argn
Foo.method = function () {
// Результат: foo.prototype.method.call (this, arg1, arg2 ... argn)
Function.call.apply (foo.prototype.method, аргументы);
};
Взаимосвязь между параметрами функции и атрибутами аргументов
Объект аргументов создает методы Getter и Setter как для своих собственных свойств, так и для параметров функции.
Следовательно, изменение формальных параметров функции повлияет на значения свойства соответствующего объекта аргументов и наоборот.
Кода -копия выглядит следующим образом:
Функция foo (a, b, c) {
аргументы [0] = 2;
а; // 2
b = 4;
аргументы [1]; // 4
var d = c;
d = 9;
c; // 3
}
foo (1, 2, 3);
Проблемы с производительностью
Аргументы не будут создаваться только в двух случаях, один объявляется как локальная переменная внутри функции, а другой используется в качестве формального параметра функции. В других случаях объект аргументов всегда будет создан.
Поскольку методы Getter и Setter всегда создаются при создании объектов аргументов, использование аргументов мало влияет на саму производительность.
Тем не менее, существует ситуация, которая серьезно влияет на производительность JavaScript, которая заключается в использовании Arguments.callee.
Кода -копия выглядит следующим образом:
функция foo () {
Arguments.callee; // Сделайте что -нибудь с этим объектом функции
Arguments.callee.caller; // и объект функции вызова
}
function bigloop () {
для (var i = 0; i <100000; i ++) {
foo (); // обычно будет вставлен ...
}
}
В приведенном выше коде функция FOO больше не является простым встроенным расширением, потому что она должна знать себя и своего абонента. Это не только компенсирует улучшения производительности, вызванные встроенными расширениями, но также подрывает инкапсуляцию функции, потому что сама функция может потребоваться полагаться на конкретный фон вызова.
Поэтому рекомендуется, чтобы вы пытались не использовать Arguments.callee.
Выше всего посвящено объекте JavaScript Arguments. Вы это тщательно знаете? Проще говоря
Аргументы относятся к объекту параметра функции (относится к фактическим параметрам передачи)
Arguments.length относится к длине объекта параметра функции.
Аргументы [i] относится к значению параметра I-TH (первый-0)