2009-10-01 7 views
9
Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), 
     object = args.shift(); 
     return function(){ 
       return fn.apply(object, 
        args.concat(Array.prototype.slice.call(arguments))); 
     }; 
}; 


var myObject = {}; 
function myFunction(){ 
    return this == myObject; 
} 
assert(!myFunction(), "Context is not set yet"); 
var aFunction = myFunction.bind(myObject) 
assert(aFunction(), "Context is set properly"); 

La pequeña modificación del código de Jeffery a continuación me ayudó a comprender los argumentos utilizados en la función anónima interna. Acabo de cambiar las 3 líneas de abajoExplicando algunos de los códigos ninja de John Resig

var introduce = function(greeting) { alert(greeting + ", my name is " + this.name + " ,home no is " + arguments[1]); } 

hiBob(" 456"); // alerts "Hi, my name is Bob" 
yoJoe(" 876"); 

Gracias a todos

+0

Sin upvotes? Debe garantizar al menos 1 o 2 –

Respuesta

8

El objeto arguments es un objeto de matriz similar, que sólo tiene la propiedad de longitud.

Llamar a la función slice a través del Array.prototype es una técnica común para convertirla en una matriz, por lo que podrá utilizar funciones de matriz como shift y concat en este ejemplo, directamente.

+1

Odio que los argumentos sean una matriz medio horneada, tan molesto –

+0

Sí. Siempre pensé que era cojo, también. – Nosredna

+0

Sí, molesto, esta es una de las cosas que se mejorarán en ECMAScript 5 ... – CMS

1

Para responder a su pregunta, esto es lo que hace rebanada

Array.slice(begin[,end]) El método rebanada crea una nueva matriz a partir de una sección seleccionada de una matriz. El matriz original no se ve afectada por esta pero, si se altera una cadena o un número en una matriz, no se refleja en la otra, mientras que un cambio a un objeto referenciado se puede ver en ambos objetos Array. El método de división utiliza el índice de matriz basada en cero a para determinar la sección a partir de la cual crea la nueva matriz. Extrae para, pero sin incluir, el elemento 'final' (si no se especifica 'final', el valor predeterminado es el último elemento). El siguiente código crea una matriz denominada 'árboles' y luego muestra una 'rebanada' de que: Código:

trees = ["oak", "ash", "beech", "maple", "sycamore"] 
document.write(trees.slice(1,4)) 

Salida: fresno, haya, arce Si utiliza un índice negativo para el 'fin ', esto especifica un elemento tantos lugares desde el final. Continuando con el ejemplo anterior, el código siguiente exhibiría la segunda a través de la tercero para durar elementos de la matriz:
Código:

trees = ["oak", "ash", "beech", "maple", "sycamore"] 
document.write(trees.slice(1,-2)) 

de salida: fresno, haya

cuanto a qué división da el contexto actual, CMS tiene la respuesta correcta

+0

Eso realmente no responde su pregunta. Creo que ella quería saber qué hizo en el contexto dado. – cdmckay

+0

Ah, la próxima vez voy a inferir lo que realmente quiere saber :) –

+1

Creo que es injusto bajar esta respuesta. Yo mismo iba a señalar que slice se puede usar para copiar una matriz en lugar de solo pasar una referencia. –

6

Array.prototype.slice.call(arguments) crea un Array que contiene todos los argumentos pasados ​​a t él funciona

-1

Convierte el objeto arguments en un objeto Array para que pueda llamar al args.shift().

objeto los argumentos es un objeto de matriz-como que tiene 0 o más propiedades índice numérico y una propiedad length

+2

No hay 'Arguments' tipo en JavaScript. 'arguments' es un' Objeto' simple con cero o más propiedades numéricas y una propiedad 'length' (un objeto similar a una matriz). –

+0

Mi error, solucionado eso. – cdmckay

6

Este código crea un nuevo método en el tipo Function llamado bind que acepta una función libre como entrada y devuelve una función de envoltura que lo llama como si fuera un método en el objeto especificado. Esto es bastante similar a cómo un delegado de .Net ajusta una función y su referencia asociada this.

Además, si se proporciona más de un argumento a bind, estos argumentos adicionales se anteponen a la llamada; esta técnica también se llama currying.

Para tratar de explicarlo de una manera más simple, considerar algo como esto:

var bob = { name: "Bob" }; 
var joe = { name: "Joe" }; 

var introduce = function(greeting) { alert(greeting + ", my name is " + this.name); } 

var hiBob = introduce.bind(bob, "Hi"); 
var yoJoe = introduce.bind(joe, "Yo"); 

hiBob(); // alerts "Hi, my name is Bob" 
+0

Gracias. Esta información fue útil para que busque más en ese código. Susan – Susan

+0

Su respuesta fue la más útil para mí, ya que aprendí sobre el currying – Susan

Cuestiones relacionadas