2017-02-25 17 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) 
として

それはdefinePropertyハンドラを持っているのでES6プロキシは、有望に見えたが、「プロキシ」には不可能であると思われます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>

関連する問題