Функции вызова и применения редко используются в некоторых простых операциях JavaScript. В других крупных операциях, таких как разработка веб -приложений, эти две функции могут часто встречаться в разработке JS -структуры. Существует также много информации о объяснениях этих двух функций, но я думаю, что большая часть информации либо написана, либо очень похожа, и не хватает приземленных объяснений. Затем я пытаюсь проанализировать и объяснить эти две функции с более четкой и более простой идеей.
Кода -копия выглядит следующим образом:
Мы можем рассматривать Call () и Apply () как методы определенного объекта и косвенно вызовы, вызывая реализацию метода. Первый аргумент Call () и Apply () является родительским объектом, чтобы вызвать функцию. Это вызывающий контекст, и ссылка на него получается через это в организме функции. Чтобы вызвать функцию f () на методе объекта o, вы можете использовать call () и применить () как это: f.call (o) f.apply (o). [1]
Давайте сначала проанализируем звонок. Вот объяснение функции вызова с помощью 3-го издания ECMascript 3-е издание [2]: Когда метод вызова вызывается функцией объекта (func.call (0)), необходимо передавать необходимый параметр и несколько несущественных параметров. Его процесс выполнения следующим образом:
a, Если объект, вызовный вызов, не работает, выбрасывается ошибка TypeError.
b, установите список параметров на пустое
c, если вызываемый метод проходит более одного параметра, то вставьте Arg1, arg2 ... в список параметров в свою очередь
D, возвращает результат вызова вызова, замените это в функции вызова (func) на пропущенный параметр 1 и рассматривает список передаваемых параметров как параметр этой функции.
Фактически, функция вызова является прототипом объекта функции. То есть функция, которую вызовы также должны быть функцией. При обращении на этот вызов просто замените это в функции, которая вызывает вызов с помощью прошел объект. Вот пример:
<script> function c1 () {this.name = 'Zhang San'; this.age = '24 '; this.sayname = function () {console.log («Вот класс c1, мое имя:«+this.name+»мой возраст -+this.age); }} функция c2 () {this.name = 'li si'; this.age = '25 '; } var c1 = new c1 (); var c2 = new c2 (); c1.sayname (); c1.sayname.call (c2); </script>Результаты исполнения:
Вот категория C1, меня зовут: Zhang San My Age 24
Вот категория C1, меня зовут: Li Si мой возраст 25
В приведенном выше коде объявляются два класса, C1 и C2. C1 имеет два свойства, один метод, а C2 также обладает двумя свойствами, такими же, как C1. После экземпляра C1.sayname () печатает фактические свойства, но c1.sayname.call (c2) печатает свойства C2, почему это? Поскольку SayName () является функцией, и в теле функции есть это, когда вызов выполнен, это будет заменено C2, поэтому атрибут C2 в конечном итоге будет напечатан.
Разница между применением и вызовом заключается в прохождении дополнительных параметров. Все дополнительные параметры применения хранятся в массиве, так как вводится один параметр, в то время как вызов передается в несколько параметров.
Итак, каковы приложения функций применения и вызова? Первый - найти самый большой элемент в числовом массиве в сети. Вы можете использовать math.max.apply (null, массив) напрямую. Другой - использовать применить и призывать к наследству, следующим образом:
<script> function Human (имя, пол) {this.name = name; this.sex = sex; this.walk = function () {console.log ('я хожу'); }} function child () {human.call (this, "xiao ming", "male") this.paly = function () {console.log ('мне очень нравится играть'); } this.intruduce = function () {console.log ('Привет всем, i'+this.name); }} var jinp = new Human ('jack', 'male'); var xiaoping = new Child (); xiaoping.walk (); xiaoping.paly (); xiaoping.intruduce (); </script>Результаты исполнения:
Я иду
Я очень люблю играть
Всем привет, я Сяо Мин
Аналогичная функция для call () и Apply () - bind (), которая представляет собой новый метод, добавленный в Ecmascript 5, но ее можно легко смоделировать в Ecmascript 3. Функция BIND также является функцией. Прототип метод в JavaScript. Основное содержание этого метода - привязать функцию с объектом. Когда метод bind () связан с функцией f (), а объект o передается в виде параметра, этот метод вернет новую функцию и будет вызван как метод O. Любые аргументы, передаваемые новой функции, будут переданы в исходную функцию. следующее:
<script> Введение функции (страна, Hobby) {return "Привет всем, меня зовут"+this.name+", в этом году"+this.age+"Год, от"+country+", как"+hobby; } var xiaoming = {name: "xiao ming", возраст: 20} var jieshao = urvuce.bind (xiaoming); console.log (jieshao («Китай», «Играя в мяч»); </script>Результаты исполнения:
Привет всем, меня зовут Сяо Мин, мне 20 лет, из Китая, я люблю играть в баскетбол
Приведенный выше пример эквивалентен:
<script> Введение функции (страна, Hobby) {return "Привет всем, меня зовут"+this.name+", в этом году"+this.age+"Год, от"+country+", как"+hobby; } var xiaoming = {name: "xiaming", возраст: 20} console.log (urvuce.apply (Xiaoming, ["China", "play"])); // или console.log (urvuce.call (xiaoming, "kina", "play")); </script>Следует отметить, что в строгом режиме Ecmascript 5 первый реальный аргумент Call () и Apply () станет этим значением, даже если передача в реальном аргументе является исходным значением или даже нулевым или неопределенным. В режиме Ecmascript 3 и без Strict, пройденное нулевое и неопределенное будет заменено глобальной конфронтацией, в то время как другие исходные значения будут заменены соответствующим объектом обертки.
Ссылки
[1], авторитетное руководство JavaScript, 6 -е издание, стр. 189
[2], function.prototype.call (thisarg [, arg1 [, arg2,…]))
[3], function.prototype.apply (thisarg, argarray)