support - template string javascript
¿Por qué se pueden llamar a las funciones sin paréntesis cuando se usan cadenas de plantillas? (1)
El primer ejemplo ( log`foo`
) permite que la especificación del idioma determine los valores pasados a la función de registro (ver 12.3.7 ). El segundo ejemplo ( log(`foo`)
) pasa explícitamente un solo argumento.
Los literales de plantilla pueden contener cadenas, así como expresiones. A veces es posible que desee tener más control sobre la compilación de una cadena a partir de sus partes de cadena y partes de expresión. En este caso, puede que estés buscando plantillas etiquetadas.
var name = "Jonathan";
var mssg = foo `Hello, ${name}. Nice name, ${name}.`;
function foo ( strings, ...values ) {
console.log( strings ); //["Hello, ", ". Nice name, ", ".", raw: Array[3]]
console.log( values ); //["Jonathan", "Jonathan"]
}
Observe aquí cómo se pasan todas las cadenas a través del primer argumento. Además, todas las expresiones de valores interpolados se pasan a través del resto de los parámetros (agrupados aquí en una matriz).
Con este control adicional, podríamos hacer todo tipo de cosas, como la localización. En este ejemplo, la especificación de lenguaje determina los valores apropiados para pasar a la función, el desarrollador no determina esto.
Para contrastar, cuando llamas log(
, terminas obteniendo solo la cadena resultante. Sin objetos, sin partes, sin valores en bruto. foo
)
Esta pregunta ya tiene una respuesta aquí:
- Backticks llamando a una función 2 respuestas
Tengo una función de registro simple:
function log(str) {
console.log(''logged: '', str);
}
Si lo llamo sin paréntesis (actualmente utilizando las herramientas de desarrollo de Chrome) y paso una cadena de plantilla, como esta:
log`foo`
La salida es: logged: ["foo", raw: Array[1]]
Si lo llamo entre paréntesis,
log(`foo`)
La salida es: logged: foo
¿Por qué llamar a una función usando una cadena de plantilla y un paréntesis no funciona en Javascript? ¿Qué sucede que hace que el resultado sea diferente de llamarlo entre paréntesis?