Console retorna indefinido

então ive seqüestrado a function de console

var log = Function.prototype.bind.call(console.log, console); console.log = function (a) { log.call(console, a); submitmsg("Log", a); }; 

isso tem o efeito desejado, mas também retorna “indefinido” como um bônus inesperado

Eu não consigo entender o porquê, o que me leva a pensar que há algo um pouco errado aqui

insira a descrição da imagem aqui

Olá mundo é gerado por log.call(console, a) como esperado

submitmsg() é minha function personalizada

isso está funcionando exatamente como eu quero, como eu disse que estou um pouco preocupado que também está retornando “indefinido” por razões que eu não entendo.


Nota: O código a seguir foi postado pelo OP como uma resposta para a pergunta. Os comentários sobre a resposta foram movidos para os comentários sobre a questão.


Então o código correto deve ser o seguinte?

 var log = Function.prototype.bind.call(console.log, console); console.log = function (a) { return log.call(console, a); submitmsg("Log", a) }; 

Se entendi sua pergunta corretamente, é porque você não está retornando explicitamente nada da function. Quando você não retorna um valor de uma function, ele retorna implicitamente undefined .

Por exemplo:

 function example() {} console.log(example()); //undefined 

Isso é definido na especificação do método interno [[Call]] (pontos relevantes em negrito):

  1. Deixe funcCtx ser o resultado de estabelecer um novo contexto de execução para o código de function usando o valor da propriedade interna [[FormalParameters]] de F, os argumentos passados ​​Listar args, e este valor como descrito em 10.4.3.
  2. Seja resultado o resultado da avaliação do FunctionBody que é o valor da propriedade interna [[Code]] de F. Se F não tiver uma propriedade interna [[Code]] ou se seu valor for um FunctionBody vazio, então o resultado é (normal, indefinido, vazio).
  3. Saia do contexto de execução funcCtx, restaurando o contexto de execução anterior.
  4. Se result.type for throw, então, throw result.value.
  5. Se result.type for retornar, retorne result.value.
  6. Caso contrário, result.type deve ser normal. Retornar indefinido.