我有一个函数声明,例如
function a(){alert("Hello");}
并且我希望在上面的脚本之前运行一个脚本,以便上面的函数声明不起作用,即它不应该抛出错误和a();
不应打开警报窗口。
如果是像这样的变量赋值
var a = function (){ alert("Hello");};
我可以做到
Object.defineProperty(window, 'a', {value: function(){}});
因此 a 不可写,并且之后发生的赋值无效。
但是,对于函数声明来说,同样的事情似乎是不可能的。无论我如何设置可写/可配置,都会应用新函数声明,否则会引发错误,例如
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 Proxy 看起来很有前途,因为它有 defineProperty
处理程序,但似乎不可能“代理”window
对象。
现在我有一种感觉,由于函数声明是通过浏览器或ecmascript规范实现的,所以不可能实现这一点。有什么办法可以实现这一点吗?
或者,如果有一种方法可以在声明函数 a
时收到通知,那么我可以执行 window.a = function (){}
。有这样的办法吗?
最佳答案
我发现执行此操作的唯一方法 (.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>
关于javascript - 覆盖 Javascript 中的全局函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42453885/