La primera vez que traducí un artículo técnico, ¡me reí de ti!
Texto original traducido:
Function.apply y function.Call en JavaScript
Se omite el primer párrafo.
Cada función de JavaScript tiene muchos métodos adjuntos, incluidos toString (), call () y aplicar (). Parece que le resultará extraño que una función pueda tener sus propios métodos, pero recuerde que cada función en JavaScript es un objeto. Eche un vistazo a este artículo y revise las características (de actualización) JavaScript. También es posible que desee saber la diferencia entre funciones y métodos en JavaScript. Creo que la descripción de "funciones" y "métodos" es solo una convención habitual de JavaScript. Las funciones se basan en sí mismas (por ejemplo: alerta ()), y los métodos son los atributos de un objeto dentro de la función (diccionario), y llamamos métodos a través de objetos. Cada objeto JavaScript tiene un método toString (). El siguiente es un ejemplo del código. En un objeto de función, podemos usar el método ToString ().
function foo () {alert ('x');} alert (foo.ToString ());Debido a que las funciones son objetos, tienen sus propias propiedades y métodos. Podemos pensar en ellos como datos. En este artículo, solo nos centramos en los métodos de dos funciones aplicadas () y llamar ().
Comencemos con el siguiente código:
var x = 10; función f () {alerta (this.x);} f ();Definimos una función global f (). F () accede a la variable x a través de esta palabra clave, pero debe tenerse en cuenta que no podemos llamar a esta función a través de una instancia de un objeto. ¿A qué objeto hace este punto? Esto apuntará a este objeto global. Nuestra variable x se define en este objeto global. El código anterior puede ejecutarse normalmente. El resultado en ejecución mostrará un cuadro de diálogo y se muestra 10 en el cuadro de diálogo.
Podemos llamar a la llamada () y aplicar () a través de esto. Como el siguiente ejemplo muestra cómo usar Call ()::
var x = 10; var o = {x: 15}; function f () {alert (this.x);} f (); f.call (o);Primero, llamar f () mostrará el cuadro de diálogo de 10, porque este punto al objeto global en este momento. Luego llamamos al método de llamada () de la función F, el parámetro pasado en IS O, y el resultado de ejecución muestra el valor del atributo x en o 15. El método Call () usará su primer parámetro como este puntero a la función F. Es decir, diremos el tiempo de ejecución a qué objetar esto en la función F puntos.
Este salto suena un poco divertido, e incluso es una anomalía para los programadores C ++, Java y C#. Estas son todas partes interesantes de ECMAScript.
También puede pasar parámetros a la función a través de la llamada ():
var x = 10; var o = {x: 15}; function f () {alert (this.x);} f (); f.call (o);Aplicar () y llamar () son similares, excepto que aplicar () requiere que el segundo parámetro sea una matriz. Esta matriz se pasará como un argumento a la función de destino.
var x = 10; var o = {x: 15}; función f (mensaje) {alerta (mensaje); alerta (this.x);} f ('invocar f'); f.apply (o, ['invocar f a través de aplicar']);El método Apply () es útil porque podemos crear una función sin preocuparnos por los parámetros del método de destino. Esta función puede pasar parámetros adicionales al método a través del parámetro de la segunda matriz de Aplicar ().
var o = {x: 15}; función f1 (mensaje1) {alerta (mensaje1 + this.x);} function f2 (mensaje1, mensaje2) {alerta (mensaje1 + (this.x * this.x) + message2);} function g (object, func, func.apply (objeto, args);} g (o, f1, ['el valor de x =']; ['El valor de x squared =', '.Hay algo mal con esta sintaxis. Para llamar al método Aplicar (), obligamos a la función objetivo a usar los parámetros en la matriz. Afortunadamente, hay una manera de facilitar esta sintaxis. Antes de esto, primero debemos introducir uno: identificador de parámetros.
En JavaScript, cada función en realidad tiene una lista de parámetros de longitud variable. Esto significa que incluso si una función tiene solo un parámetro, podemos pasar 5 parámetros. El siguiente código no tendrá ningún error, y el resultado muestra "H".
función f (mensaje) {alerta (mensaje);} f ('h', 'e', 'l', 'l', 'o');En f (), si no queremos aceptar otros parámetros, podemos usar los argumentos de palabras clave. Los argumentos representan un objeto de argumento, que tiene un atributo que representa una longitud similar a una matriz.
función f (mensaje) {// El valor del mensaje es el mismo que los argumentos [0] para (var i = 1; i <arguments.length; i ++) {mensaje+= argumentos [i]; } alert (mensaje);} // El resultado muestra "Hola" f ('h', 'e', 'l', 'l', 'o');Debe saber que estrictamente hablando, los argumentos no son una matriz. Los argumentos tienen un atributo de longitud, pero no hay métodos divididos, push y pop. En la función G () anterior, podemos copiar los parámetros requeridos de los argumentos, formar una matriz y luego pasar esta matriz para aplicar ().
var o = {x: 15}; función f (mensaje1, mensaje2) {alerta (mensaje1 + (this.x * this.x) + Message2);} function g (objeto, func) {// argumentos [0] = objeto // argumentos [1] = Funcar var args = []; para (var i = 2; i <arguments.length; i ++) {args.push (argumentos [i]); } func.apply (objeto, args);} g (o, f, 'el valor de x squared =', '. wow!');Cuando llamamos a G (), podemos pasar argumentos adicionales como parámetros en lugar de meter los argumentos en una matriz.