2011-10-06 9 views
14

Quería invocar una función utilizando el método javascript apply(). Esto funciona bien si la función no tiene argumentos. es decirMétodo de solicitud de llamada con argumentos en JavaScript

function test() 
{ 
    console.log(this); 
} 

body = document.getElementsByTagName("body")[0]; // shortcut to body element 

test.apply(body); // returns [object HTMLBodyElement] 

Pero me parece que no puede hacer lo mismo para invocar una función que tiene argumentos:

function test(msg) 
{ 
    console.log(msg); 
} 

body = document.getElementsByTagName("body")[0]; // shortcut to body element 

test(this).apply(body); // mysteriously returns the correct result, then 
// typeError: 'undefined' is not an object (evaluating "test(this).apply". 

Los ejemplos anteriores son completamente trivial, pero el grano de mi pregunta es: ¿cómo Uso el método apply() para invocar una función con argumentos.

Respuesta

26

apply toma dos argumentos:

test.apply(null, [body]); 

El primer argumento establece el valor de this cuando se ejecuta la función. El segundo es una matriz de parámetros para esa función.

En los ejemplos que puede reescribir de la siguiente manera:

function test() { 
    console.log(this); 
} 

y lo llaman de la siguiente manera:

test.apply(this); 
+0

Es importante tener en cuenta que el segundo argumento debe ser una matriz, en lugar de solo un elemento. 'test.apply (null, body)' se rompe para mí (Chrome 35), pero 'test.apply (null, [body])' funciona. – FeifanZ

+0

¿Cuál es el uso real de usar el método de aplicación? ¿Hay algún beneficio? – Thunder

+1

Estoy seguro de que hay una gran cantidad de usos reales. Algunos que vienen a la mente son las funciones de parche de mono (incluidos los built-in), para [funciones variadic] (http://en.wikipedia.org/wiki/Variadic_function), y para especificar 'this' para las funciones de devolución de llamada. –

6

Con solicitar que envíe una serie de argumentos como segundo argumento:

test.apply(body,["Hello World"]); 

Aquí está la documentación se refieren a la documentación MDN https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

+0

Muchas gracias :) – dkugappi

+0

@JohnKeyes tiene razón, debería haber prestado más atención a mi copia y pega. Corregí el error de sintaxis. – bittersweetryan

+0

Eliminaré mis comentarios aquí si lo desea. No están agregando a la respuesta. –

0

Asegúrese de añadir en el argumento:

test.apply(body, ["my message here"]); 
8

Primera observe que en realidad está invocando su función inmediatamente, la línea:

test(this).apply(body); 

falla porque en un primer momento, se llama a la función test pasar thiscomo argumento, a continuación, intenta acceder a una propiedad apply el resultado de la función, que es undefined ya que su función no devuelve nada.

El acceso a la propiedad en el valor undefined le ofrece la excepción TypeError.

Ahora, vamos a ver lo que realmente quiere hacer, si quieres pasar el valor de la variable body como argumento de la función, estableciendo el valor externo this, como el valor this de test, que puede hacer:

test.apply(this, [body]); 

Pero por eso existe el método call, cuando se sabe exactamente qué argumentos a pasar, que no es necesario para crear una matriz para nada, que acaba de pasar los argumentos:

test.call(this, body); 

El método apply es realmente útil cuando se trata, por ejemplo, de un número dinámico de argumentos, cuando se sabe qué argumentos quieren pasar y aún se puede establecer el valor this, call es justo lo que necesita.

+0

Documentación para' call': https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call –

Cuestiones relacionadas