我有一个函数声明,例如
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代理似乎很有希望,因为它有defineProperty
处理程序,但似乎不可能代理' window
对象。
现在我有一种感觉,因为函数声明是通过浏览器还是通过ecmascript规范实现的,所以不可能实现这一点。有没有办法实现这个目标?
或者,如果有一种方法可以在声明函数a
时收到通知,那么我可以window.a = function (){}
。有这样的方式吗?
答案 0 :(得分: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>