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 a continuación

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

9
Susan 2 oct. 2009 a las 03:48

5 respuestas

La mejor respuesta

El objeto argumentos es un objeto tipo matriz, solo tiene la longitud propiedad.

Llamar a la función de división a través del prototipo Array 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.

8
CMS 1 oct. 2009 a las 23:52

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

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

-1
cdmckay 2 oct. 2009 a las 00:03

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

Array.slice (comienzo [, fin]) El corte El método crea una nueva matriz a partir de un sección seleccionada de una matriz. los la matriz original no se ve afectada por esto pero, si una cadena o número en uno la matriz está alterada, no se refleja en el otro, mientras que un cambio a un el objeto referenciado se puede ver en ambos Matriz de objetos. El método de corte utiliza el índice de matriz basada en cero para determinar la sección de la cual crea la nueva matriz. Se extrae para, pero sin incluir, el 'fin' elemento (si no se especifica 'fin', el el valor predeterminado es el último elemento). los El siguiente código crea una matriz llamada 'árboles' y luego muestra una 'rebanada' de it: Código:

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

Salida: fresno, haya, arce si usted use un índice negativo para el 'fin', esto especifica un elemento tantos lugares desde el final. Continuando con el ejemplo anterior, el siguiente código mostraría el segundo a través de la penúltimos elementos de la matriz:
Código:

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

Salida: ceniza, haya

En cuanto a qué segmento da dado el contexto actual, CMS tiene la respuesta correcta

1
Allen Rice 1 oct. 2009 a las 23:57

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 contenedor que lo llama como si fuera un método en el objeto especificado. Esto es bastante similar a cómo un delegado .Net ajusta una función y su referencia this asociada.

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

Para tratar de explicarlo de una manera más simple, considere 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"
6
Jeffrey Hantin 2 oct. 2009 a las 00:02

Array.prototype.slice.call(arguments) crea un Array que contiene todos los argumentos pasados a la función.

6
Alex Barrett 1 oct. 2009 a las 23:51