Comme tous les programmeurs, je suis paresseux. Donc, dans mes utils.js
il y a une ligne simple:
window.log = console.log
Cela fonctionne bien dans Firefox , mais il fait que Chrome pleure comme un petit garçon. Je dois écrire console.log
pour le faire fonctionner.
Aucune suggestion?
La console.log
apparemment fait l'objet d'une attention à ce que this
si vous faites ceci:
window.log = console.log log('pancakes')
Ensuite, vous n'aurez plus qu'une exception "TypeError: Invocation illégale" pour vos efforts. Cependant, si vous forcez le contexte approprié ainsi:
log.apply(console, 'pancakes')
Alors vous obtiendrez vos pancakes
dans la console. C'est pourquoi vous devez envelopper console.log
dans une fonction si vous voulez être paresseux et juste dire que le log
: certaines implémentations console.log
doivent être appelées avec le contexte approprié.
Cependant, juste window.log = (x) -> console.log(x)
n'est pas tout à fait correct car console.log
est une fonction variadique. Une meilleure mise en œuvre serait la suivante:
window.log = -> console.log.apply(console, arguments)
Ou pour être pédant, puisque les arguments
ne sont pas un tableau et la Function#apply
attend un tableau, "lancer" les arguments
sur un tableau réel de la manière habituelle:
window.log = -> console.log.apply(console, Array::slice.call(arguments))
Cela devrait fonctionner de la même manière partout et préserver la nature variadique de console.log
. Je doute que vous ayez besoin d'être ce pédant, mais simplement envoyer des arguments
et prétendre que c'est un tableau devrait être bien. Vous pouvez également utiliser les splats de CoffeeScript comme une forme courte du [].slice
et arguments
:
window.log = (args...) -> console.log(args...)
Si vous regardez la version JavaScript de cela, vous verrez que ce sont les trucs et les arguments
dissimulés.
Bien sûr, si vous utilisez JavaScript, alors l'un d'entre eux fonctionnera:
window.log = function() { console.log.apply(console, arguments) }; window.log = function() { console.log.apply(console, Array.prototype.slice.call(arguments)) };
Une autre option consiste à utiliser Function#bind
force log
pour être appelé dans le contexte de la console
:
window.log = console.log.bind(console)
L'inconvénient est que tous les navigateurs ne supporte pas la bind
.
Vous devez définir window.log comme une fonction contenant console.log
window.log = function(x) { console.log(x); }