在Javascript中覆盖全局函数声明

时间:2017-02-25 08:47:19

标签: javascript

我有一个函数声明,例如

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 (){}。有这样的方式吗?

1 个答案:

答案 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>