2017-02-25 33 views
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(){}。有沒有這樣的方式?

回答

1

我發現做到這一點的唯一方法(.watch)是Firefox specific,可悲的是:

<script> 
 
function a() { console.log('no-op'); } 
 

 
window.watch('a', function (prop, oldval, newval) { 
 
    return oldval; 
 
}); 
 
</script> 
 

 
<script> 
 
function a() { alert("Hello"); } 
 
a(); 
 
</script>