8

だから私はコンソール機能を乗っ取った:

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

これには望ましい効果があります。ただし、予期しないボーナスとして「未定義」も返します。

なぜここに少し問題があるのか​​わからない。

ここに画像の説明を入力してください

Helloworldは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で説明されているこの値を使用して、関数コードの新しい実行コンテキストを確立した結果とします。
  2. Fの[[Code]]内部プロパティの値であるFunctionBodyを評価した結果を結果とします。Fに[[Code]]内部プロパティがない場合、またはその値が空のFunctionBodyである場合、結果は(normal、undefined、empty)になります。
  3. 実行コンテキストfuncCtxを終了し、前の実行コンテキストを復元します。
  4. result.typeがスローされた場合は、result.valueをスローします。
  5. result.typeがreturnの場合、result.valueを返します。
  6. それ以外の場合、result.typeは正常である必要があります。未定義を返します。
于 2012-07-06T11:00:53.427 に答える