8

所以我劫持了控制台功能:

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

这具有预期的效果。但是,它也会返回“未定义”作为意外奖励。

我不明白为什么这导致我认为这里有些问题。

在此处输入图像描述

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

1 回答 1

12

如果我正确理解了您的问题,那是因为您没有明确地从函数中返回任何内容。当您不从函数返回值时,它会隐式返回undefined.

例如:

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

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

  1. 令 funcCtx 为使用 F 的 [[FormalParameters]] 内部属性的值、传递的参数 List args 和 10.4.3 中所述的 this 值为函数代码建立新执行上下文的结果。
  2. 让 result 是对作为 F 的 [[Code]] 内部属性的值的 FunctionBody 求值的结果。如果 F 没有 [[Code]] 内部属性,或者它的值为空 FunctionBody,则结果为(正常、未定义、空)。
  3. 退出执行上下文funcCtx,恢复之前的执行上下文。
  4. 如果 result.type 被抛出,则抛出 result.value。
  5. 如果返回result.type,则返回result.value。
  6. 否则 result.type 必须是正常的。返回未定义。
于 2012-07-06T11:00:53.427 回答