控制台返回undefined

Fib*_*ire 6 javascript

所以我劫持了控制台功能

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

这有所期望的效果,但它也会返回"未定义"作为意外奖励

我无法弄清楚为什么导致我认为这里有一点点错误

在此输入图像描述

Hello world log.call(console, a)按预期生成

submitmsg() 是我的自定义功能

这正是我想要的,正如我所说的虽然我稍微担心它也因为我不理解的原因而返回"未定义".


注意: OP发布了以下代码作为问题的答案.对答案的评论已移至对该问题的评论.


所以正确的代码应该如下?

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

Jam*_*ice 12

如果我正确地理解了你的问题,那是因为你没有明确地从函数中返回任何东西.如果不从函数返回值,则会隐式返回undefined.

例如:

function example() {}
console.log(example()); //undefined
Run Code Online (Sandbox Code Playgroud)

这在[[Call]]内部方法规范中定义(相关点以粗体显示):

  1. 假设funcCtx是使用F的[[FormalParameters]]内部属性的值,传递的参数List args以及10.4.3中描述的该值为函数代码建立新的执行上下文的结果.
  2. 假设结果是评估FunctionBody的结果,即Function的[[Code]]内部属性的值.如果F没有[[Code]]内部属性或其值为空FunctionBody,则结果为(normal,undefined,empty).
  3. 退出执行上下文funcCtx,恢复先前的执行上下文.
  4. 如果result.type是throw,则抛出result.value.
  5. 如果result.type是return,则返回result.value.
  6. 否则result.type必须正常.返回undefined.