2012-07-06 92 views
6

所以IVE劫持控制檯功能控制檯返回undefined

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

這有預期的效果但是它也返回「未定義」作爲一個意想不到的好處

我無法弄清楚,爲什麼這使我覺得有東西稍微錯在這裏

enter image description here

你好由log.call(console, a)產生世界預計

submitmsg()是我的自定義功能

這是工作正是我想要的,正如我所說的,雖然IM略有擔心,它也返回的原因,我不明白「不確定」。


注:下面的代碼被張貼在OP作爲一個問題的答案。關於答案的評論已轉移到對這個問題的評論。


所以正確的代碼應該是以下內容?

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

這仍然還返回 「未定義」 – Fibrewire 2012-07-06 11:16:54

+0

這是因爲'log.call'返回'undefined'。這就是爲什麼我不確定你想要達到什麼樣的效果......原生的控制檯。log'方法返回'undefined'。你想要返回什麼? – 2012-07-06 11:18:45

+0

對不起,我已經更詳細地提交了 – Fibrewire 2012-07-06 11:29:05

回答

10

如果我正確地理解了你的問題,那是因爲你沒有明確地從函數返回任何東西。當你不從函數返回一個值時,它隱含地返回undefined

例如:

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

這在[[Call]] internal method specification(粗體相關點)之一定義:

  1. 設funcCtx是使用建立功能代碼新的執行上下文的結果F的[[FormalParameters]]內部 屬性的值,傳遞的參數List args和此值在10.4.3中描述的 。
  2. 讓結果成爲評估F的[[Code]]內部屬性值的FunctionBody的結果。如果F沒有 [[Code]]內部屬性,或者其值爲空函數體,則 的結果爲(正常,未定義,爲空)。
  3. 退出執行上下文funcCtx,恢復上一個執行上下文。
  4. 如果result.type被拋出然後拋出result.value。
  5. 如果result.type返回,則返回result.value。
  6. 否則result.type必須正常。返回undefined。
+0

嗨James, 我確實從那裏開始,但是該功能會覆蓋控制檯的輸出而不是添加到它,雖然你的答案是正確的,它不會實際輸出到控制檯 – Fibrewire 2012-07-06 11:07:56

+0

@Fibrewire - 你期待什麼被返回?原生的'console.log'方法返回'undefined',所以我沒有看到問題。 – 2012-07-06 11:12:26

相關問題