Chrome ne reconnaît pas console.log lorsqu'il s'appelle le journal

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); }