0
我有一個函數聲明,例如在JavaScript中重寫全局函數聲明
function a(){alert("Hello");}
,我想有一個腳本來之前運行上面的腳本,使上述函數的聲明是無效的,即它不應該拋出錯誤,a();
不應該打開一個警告窗口。
如果它像
var a = function(){ alert("Hello");};
變量賦值我能做
Object.defineProperty(window, 'a', {value: function(){}});
,這樣一個不可寫,並且恰巧沒有效果之後任務。
但是,同樣的事情似乎是不可能的函數聲明。不管我怎麼設置寫入/可配置的,新的函數聲明應用或者拋出錯誤,如
Uncaught SyntaxError: Identifier 'a' has already been declared (Chrome)
TypeError: cannot declare global binding `a': property must be configurable or both writable and enumerable (Firefox)
ES6代理似乎是有前途的,因爲它有defineProperty
處理程序,但它似乎是不可能的「代理」 window
對象。
現在我有一種感覺,因爲如何通過瀏覽器或ecmascript規範實現函數聲明,這是不可能實現的。有什麼辦法可以做到這一點?
或者,如果有一種方法可以在函數a
被聲明時得到通知,那麼我可以做window.a = function(){}
。有沒有這樣的方式?