Прежде чем упомянуть вышеупомянутые концепции, я сначала хочу поговорить о неявных параметрах функций в JavaScript: аргументы.
Аргументы.
Этот объект представляет параметры выполняемой функции и функции, которая ее вызывает.
[функция.]аргументы[n]
Функция параметра: опции. Имя объекта Function, выполняющегося в данный момент. н: вариант. Индекс значения параметра, отсчитываемый от 0, которое должно быть передано объекту Function.
Описание
Аргументы — скрытый объект, создаваемый дополнительно к указанным параметрам при вызове функции. Аргументы — это объект, похожий на массив, но не на массив. Говорят, что он похож на массив, поскольку имеет те же свойства и методы доступа, что и массив. Доступ к значению соответствующего единственного параметра можно получить через аргументы[. n], и он имеет атрибут length длины массива. Кроме того, объект аргументов хранит параметры, фактически переданные функции, не ограничиваясь списком параметров, определенным в объявлении функции, и объект аргументов не может быть создан явно. Объект аргументов доступен только в начале функции. В следующем примере подробно описаны эти свойства:
//Использование объекта аргументов.
функция ArgTest(a, b){
var i, s = "Ожидается функция ArgTest";
var numargs = аргументы.длина // Получаем значение переданного аргумента.
var expargs = ArgTest.length // Получаем значение ожидаемого параметра.
если (выражения < 2)
s += expargs + "аргумент. ";
еще
s += expargs + "аргументы. ";
если (числовые числа < 2)
s += numargs + "было передано.";
еще
s += numargs + "были переданы.";
s += "nn"
for (i =0; i < numargs; i++){ // Получаем содержимое параметра.
s += " Arg " + i + " = " + аргументы[i] + "n";
}
return(s); // Возвращаем список параметров.
}
Сюда добавлен код, указывающий, что аргументы не являются массивом (класс Array):
Array.prototype.selfvalue = 1;
оповещение (новый массив (). Selfvalue);
функция testAguments(){
оповещение(arguments.selfvalue);
}
Запустите код, и вы обнаружите, что первое предупреждение отображает 1, что означает, что объект массива имеет атрибут selfvalue со значением 1. Когда вы вызываете функцию testAguments, вы обнаружите, что отображается «не определено», указывая, что это не атрибут аргументов. То есть аргументы не являются объектом массива.
звонящий
Возвращает ссылку на функцию, вызвавшую текущую функцию.
имя_функции.вызывающий
Объект functionName — это имя выполняемой функции.
Обратите внимание, что для функций атрибут вызывающего объекта определяется только при выполнении функции. Если функция вызывается с верхнего уровня, вызывающая сторона содержит значение null. Если атрибут вызывающего объекта используется в строковом контексте, результат тот же, что и functionName.toString, то есть отображается декомпилированный текст функции.
Следующий пример иллюстрирует использование атрибута caller:
// демо-звонок {
функция callerDemo() {
если (callerDemo.caller) {
var a= callerDemo.caller.toString();
предупреждение(а);
} еще {
alert("это топовая функция");
}
}
функция handleCaller() {
вызывающийДемо();
}
вызываемый
возвращает выполняемый объект Function, который является телом указанного объекта Function.
[функция.]arguments.callee
Необязательный параметр функции — это имя объекта Function, который выполняется в данный момент.
Обратите внимание, что
начальным значением атрибута вызываемого объекта является выполняемый объект Function.
Атрибут callee является членом объекта аргументов. Он представляет собой ссылку на сам объект функции, что полезно для рекурсии анонимных функций или для обеспечения инкапсуляции функций. Например, в следующем примере рекурсивно вычисляется сумма натуральных чисел. числа от 1 до n. Это свойство доступно только при выполнении соответствующей функции. Также следует отметить, что у вызываемого объекта есть атрибут длины, который иногда удобнее проверять. аргументы.длина — это фактическая длина параметра, а аргументы.callee.длина — это длина формального параметра. Отсюда вы можете определить, соответствует ли длина формального параметра фактической длине параметра во время вызова.
Пример
//вызываемый абонент может распечатать себя
функция calleeDemo() {
оповещение(arguments.callee);
}
//Используется для проверки параметров
функция calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("Проверьте правильность формальной и фактической длины параметра!");
возвращаться;
} еще {
alert("Фактическая длина параметра: " +arguments.length);
alert("Длина формального параметра: " +arguments.callee.length);
}
}
//Рекурсивный расчет
вар сумма = функция (n) {
если (n <= 0)
возврат 1;
еще
вернуть n + аргументы.callee(n - 1)
}
Более общая рекурсивная функция:
var sum = function(n){
если (1==n) вернуть 1;
иначе вернуть n + сумму (n-1);
При вызове: alert(sum(100));
Функция содержит ссылку на саму сумму. Имя функции — это просто имя переменной. Вызов sum внутри функции эквивалентен вызову глобальной переменной. В этом случае использование вызываемого объекта будет. сравнение. Хороший подход.
apply и call
предназначены для привязки функции к другому объекту для работы. Единственная разница между ними заключается в способе определения параметров:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2...] ]) ;
То есть указателю this внутри всех функций будет присвоено значение thisArg, что может обеспечить запуск функции как метода другого объекта.
Объяснение Apply
заключается в том, что если argArray не является допустимым массивом или не является аргументом. объект, это вызовет ошибку TypeError.
Если ни argArray, ни thisArg не указаны, в качестве thisArg будет использоваться объект Global.
и никакие параметры не могут быть переданы.
Описание вызова
Метод вызова изменяет контекст объекта функции с исходного контекста на новый объект, указанный thisArg.
Если параметр thisArg не указан, то в качестве thisArg используется объект Global.
Советы по теме.
Существует еще один трюк в применении вызова и применения. То есть после использования вызова и применения для применения другой функции (класса) используется текущая функция (. class) будут доступны методы или свойства другой функции (класса) также можно назвать «наследованием». Посмотрите на следующий пример:
// Демонстрация наследования
функция базы() {
this.member = "dnnsun_Member";
этот.метод = функция() {
окно.alert(this.member);
}
}
функция расширения() {
base.call(это);
окно.alert(член);
окно.alert(этот.метод);
}
Как видно из приведенного выше примера, расширение может наследовать методы и свойства базы после вызова.
Кстати, apply используется в прототипе платформы JavaScript для создания шаблона
, определяющего класс. Код реализации следующий:
var Class = {.
создать: функция() {
функция возврата() {
this.initialize.apply(это, аргументы);
}
}
}
Анализ: с точки зрения кода этот объект содержит только один метод: Create, который возвращает функцию, то есть класс. Но это также конструктор класса, который вызывает инициализацию, и этот метод представляет собой функцию инициализации, определенную при создании класса. Таким образом,
Вы можете реализовать пример режима создания класса в прототипе
:
var Vehicle=Class.create();
Vehicle.prototype={
инициализировать: функция (тип) {
this.type=тип;
}
showSelf: функция() {
alert("это транспортное средство "+ this.type);
}
}
var moto=новый автомобиль("Мото");
мото.showSelf();
Более подробную информацию о прототипе можно найти на его официальном сайте.
http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html