una pasar parametros llamar lista insertar funciones funcion externo desde cómo codigo javascript call bind

pasar - llamar javascript desde html



Enlazar más argumentos de una función ya enlazada en Javascript. (2)

Intento ordenar mis pensamientos sobre cómo funciona el enlace () de javascript.

Veo que si lo hago

var f = function (a) { ... } var g = f.bind(obj); g(1)

entonces f se llama con obj como this y 1 como a .

Lo que pensé que es g es una función de envoltorio alrededor de f.

Pero cuando lo hago

var f = function (a) { ... } var g = f.bind(obj); g.call(1)

entonces f se llama con 1 como this y a indefinido.

Así que parece que g no es solo un envoltorio simple, sino que call alguna manera diferencia entre funciones normales y enlazadas.

Una cosa más es que no puedo aplicar parcialmente una función más veces.

var f = function (a) { ... } var g = f.bind(obj); var h = g.bind(1); h();

Entonces f se llama con obj como this y a indefinido.

¿Cuál es la causa de este comportamiento?

Editar

Las construcciones en esta pregunta son realmente incorrectas, vea la respuesta aceptada sobre cómo deberían ser (en general, no he notado que la call y el bind siempre necesitan el argumento del contexto como primer argumento).


Nunca pasaste ningún argumento, solo estableciste un contexto. el primer argumento de la call se recibe como contexto ( this ), y los argumentos 2 en adelante se reciben como los argumentos 1 de la función llamada y en adelante. Mientras tanto, bind crea una nueva función con un nuevo contexto: los argumentos se pasan cuando se invocan.

Aquí hay formas de pasar 1 como argumento de la función f a partir de su primer bloque de código:

f( 1 ); g( 1 ); g.call( this, 1 ); g.apply( this, [ 1 ] );


Una vez que haya vinculado un objeto a una función con vinculación, no podrá anularlo. Está claramente escrito en las especificaciones, como se puede ver en la documentación de MDN :

"La función bind () crea una nueva función (una función enlazada) con el mismo cuerpo de la función (propiedad de llamada interna en términos ECMAScript 5) que la función a la que se está activando (la función de destino de la función enlazada) con este valor enlazado a el primer argumento de bind (), que no puede ser anulado " .

Eso significa, también si lo haces:

g.call(1);

Obtendrá obj como this , y no 1 - en los navegadores que siguen las especificaciones.

Por supuesto, puedes unir múltiples argumentos, así que:

var sum = function(a, b, c) { return a + b + c }; var sumAB = sum.bind(null, 1, 5); var sumC = sumAB.bind(null, 2); console.log(sumC());

Pero el objeto de contexto siempre será el que se especificó con el primer bind , porque no se puede sobrescribir.

Solo para evitar confusiones, el primer argumento de la call es el objeto de contexto ( this ), luego tendrá el resto del argumento.

Significa:

var obj = { foo: function(bar) { console.log(bar) } }; obj.foo(''hello''); // equivalent to: var foo = obj.foo; foo.call(obj, ''hello'');

Espero eso ayude.