控制台返回未定义

IT技术 javascript
2021-01-14 03:40:39

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

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

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

我不明白为什么这让我觉得这里有点不对劲。

在此处输入图片说明

Hello worldlog.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)
};
1个回答

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

例如:

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

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

  1. 令 funcCtx 成为使用 F 的 [[FormalParameters]] 内部属性的值、传递的参数 List args 和 this 值为函数代码建立新的执行上下文的结果,如 10.4.3 中所述。
  2. 令 result 是对 FunctionBody 求值的结果,FunctionBody 是 F 的 [[Code]] 内部属性的值。如果 F 没有 [[Code]] 内部属性或其值为空的 FunctionBody,则结果为(正常、未定义、空)。
  3. 退出执行上下文funcCtx,恢复之前的执行上下文。
  4. 如果 result.type 是 throw,则抛出 result.value。
  5. 如果返回 result.type,则返回 result.value。
  6. 否则 result.type 必须是正常的。返回未定义。
@Fibrewire - 您希望返回什么?本机console.log方法返回undefined,所以我没有看到问题。
2021-03-15 03:40:39
嗨詹姆斯,我确实从那里开始,但是该功能会覆盖控制台的输出而不是添加到它,尽管您的答案是正确的,但它实际上不会输出到控制台
2021-04-03 03:40:39