tengo un problema para entender este código o con Method Borrowing ->
function func() { [].join.call(arguments) //how does this works? { unirse solo necesita un separador, ¿por qué estamos pasando this valor de contexto? y lo más interesante es que funciona!
hay alguien que me explique esto?
:)
El método .call() se usa en funciones, se comporta de manera similar a usar () para llamar a una función, como cuando ejecuta functionName() , sin embargo, le permite definir explícitamente qué es this dentro de la función , así por ejemplo:
function functionName(arg) { console.log("this", this); // this {"foo": 1} console.log("arg", arg); // arg str } functionName.call({foo: 1}, "str"); Tenga en cuenta que arriba, el primer argumento para .call() define qué es this dentro de su función, y luego el segundo argumento en adelante define cuáles son los argumentos para functionName .
Podemos usar .call() en cualquier función, incluidas las que nos proporciona JavaScript. En su código, está usando [].join que expone (no llama) la función de join de matrices, es decir, le da acceso a la función de join definida en el objeto Array.prototype . Con eso en mente, su código podría reescribirse así para resaltar que [].join se usa solo para obtener la función de join del prototipo de matriz:
function func() { const joinFn = Array.prototype.join; // or: [].join; console.log(joinFn.call(arguments)); } func('a', 'b', 'c'); // "a,b,c" Internamente, el método .join() en matrices usa this dentro de él (similar a cómo functionName() usa this dentro de él) para determinar qué objeto/matriz necesita que sus elementos se "junten". En su ejemplo, no está llamando a .join directamente en su matriz vacía (es decir: [].join() ), sino que está usando la matriz vacía para acceder a la función .join y luego llamándola con el objeto de arguments por usando join.call(arguments) . Cuando hace esto, el this dentro del método .join() se establece en el objeto de arguments y el método de unión se llama sin argumentos, por lo que el separador predeterminado es , . Como el objeto arguments es similar a una matriz (tiene índices y una propiedad de length como una matriz), sus elementos se pueden unir de la misma manera que se pueden unir los elementos de una matriz.
Puede consultar la sección 23.1.3.15 de la especificación ECMAScript para obtener más detalles sobre cómo funciona internamente Array.prototype.join y cómo se hace genérico para manejar objetos similares a matrices y no solo matrices.