В первый раз, когда я перевел техническую статью, я смеялся над вами!
Переведенный исходный текст:
Function.apply и function.call в javascript
Первый абзац опущен.
Каждая функция JavaScript имеет много прикрепленных методов, включая ToString (), Call () и Apply (). Похоже, вам будет странно, что функция может иметь свои собственные методы, но помните, что каждая функция в JavaScript является объектом. Взгляните на эту статью и просмотрите функции JavaScript (Represher). Вы также можете узнать разницу между функциями и методами в JavaScript. Я думаю, что описание «функций» и «методов» - это просто привычное соглашение JavaScript. Функции основаны на самих себя (например: alert ()), а методы являются атрибутами объекта внутри функции (словарь), и мы вызываем методы через объекты. Каждый объект JavaScript имеет метод ToString (). Ниже приведен пример кода. В функциональном объекте мы можем использовать метод ToString ().
function foo () {alert ('x');} alert (foo.tostring ());Поскольку функции являются объектами, они имеют свои собственные свойства и методы. Мы можем думать о них как о данных. В этой статье мы сосредоточены только на методах двух функций Apply () и Call ().
Начнем со следующего кода:
var x = 10; function f () {alert (this.x);} f ();Мы определяем глобальную функцию f (). f () обращается к переменной x через это ключевое слово, но следует отметить, что мы не можем вызвать эту функцию через экземпляр объекта. Какой объект это указывает? Это укажет на этот глобальный объект. Наша переменная x определяется в этом глобальном объекте. Приведенный выше код может работать нормально. Результат работы будет отображать диалоговое окно, а в диалоговом окне отображается 10.
Мы можем Call Call () и применить () через это. Как показано в следующем примере, как использовать Call ():
var x = 10; var o = {x: 15}; function f () {alert (this.x);} f (); f.call (o);Во -первых, вызов f () отобразит диалоговое окно из 10, потому что этот момент для глобального объекта в настоящее время. Затем мы называем метод Call () функции f, параметр, переданный IS O, и результат выполнения показывает значение атрибута x в o 15. Метод Call () будет использовать свой первый параметр в качестве этого указателя на функцию F. То есть мы расскажем во время выполнения, которое возражает, что это в функции F указывает.
Этот прыжок звучит немного забавно, и это даже аномалия для программистов C ++, Java и C#. Это все интересные части Ecmascript.
Вы также можете передать параметры функции через Call ():
var x = 10; var o = {x: 15}; function f () {alert (this.x);} f (); f.call (o);Apply () и call () аналогичны, за исключением того, что Apply () требует, чтобы второй параметр был массивом. Этот массив будет передаваться в качестве аргумента целевой функции.
var x = 10; var o = {x: 15}; function f (сообщение) {alert (message); alert (this.x);} f ('вызов f'); f.apply (o, ['вызов f через Apply']);Метод Apply () полезен, потому что мы можем создать функцию, не заботясь о параметрах целевого метода. Эта функция может передавать дополнительные параметры методу через второй параметр массива Apply ().
var o = {x: 15}; функция F1 (Message1) {alert (message1 + this.x);} функция F2 (сообщение1, сообщение2) {alert (сообщение1 + (this.x * this.x) + message2);} функция g (объект, func, args) {func.apply (объект, args);} g (o, f1, value of a value of of a grables [«Значение X квадрат = ',».Что -то не так с этим синтаксисом. Чтобы вызвать метод Apply (), мы заставляем целевую функцию использовать параметры в массиве. К счастью, есть способ облегчить этот синтаксис. Перед этим мы должны сначала представить один: идентификатор параметров.
В JavaScript каждая функция фактически имеет список параметров переменной длины. Это означает, что даже если функция имеет только один параметр, мы можем передать 5 параметров. Следующий код не будет иметь никаких ошибок, и результат показывает «H».
функция f (сообщение) {alert (message);} f ('h', 'e', 'l', 'l', 'o');В f (), если мы не хотим принимать другие параметры, мы можем использовать аргументы ключевого слова. Аргументы представляют объект аргумента, который имеет атрибут, представляющий длину, аналогичную массиву.
Функция f (сообщение) {// значение сообщения такое же, как аргументы [0] для (var i = 1; i <argents.length; i ++) {message+= arguments [i]; } alert (сообщение);} // Результат показывает «hello» f ('h', 'e', 'l', 'l', 'o');Вы должны знать, что строго говоря, аргументы не являются массивом. Аргументы имеют атрибут длины, но нет никаких методов разделения, толчка и поп -музыки. В предыдущей функции g () мы можем скопировать необходимые параметры из аргументов, сформировать массив, а затем передать этот массив, чтобы применить ().
var o = {x: 15}; function f (message1, message2) {alert (message1 + (this.x * this.x) + message2);} function g (объект, func) {// аргументы [0] = object // arguments [1] = func var args = []; for (var i = 2; i <arguments.length; i ++) {args.push (аргументы [i]); } func.apply (Object, args);} g (o, f, 'значение x squared =', '. Wow!');Когда мы называем g (), мы можем передать дополнительные аргументы в качестве параметров вместо того, чтобы заполнять аргументы в массив.