2013-10-18 30 views
2

我有JavaScript代碼,如果它正在瀏覽器中運行,但我不想在運行單元測試時引發警報,則會發出警報。什麼是JavaScript中的非法調用typeerror

我試圖通過具有線

if(allowAlerts === false){ 
    alert = console.log; 
} 

解決這個,但是當我再運行

alert("This bad thing happened"); 

我回來

TypeError: Illegal invocation 

直接重新分配警報是kludgey解決方案,我可以通過其他方式輕鬆解決問題,但我從來沒有遇到過非法調用錯誤befo並希望有人能夠解釋它的含義。

回答

7

console.log函數需要其調用上下文作爲控制檯。

使用

alert = console.log.bind(console); 

或者,如果你想與舊IE兼容:

alert = function(){ console.log.apply(console, arguments) }; 
+0

或者只是墊片'bind' :) –

+0

@AdamRackis正如你不能讓一個完整的墊片綁定,我是不同的這種解決方案。要麼我不關心舊的瀏覽器,要麼我完全避免使用「shim」。 –

+0

你是什麼意思?你用Object.create來混合綁定墊片嗎? bind shim不會模擬設置'this'和咖喱參數的真實情況嗎? –

相關問題