javascript - 覆盖 Javascript 中的全局函数声明

标签 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 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/

相关文章:

javascript - Javascript 中的 IP 地址解析器

javascript - 使用 JavaScript 更改 CSS 图像过滤器的 HTML Range 元素

javascript - 语法错误,无法识别的表达式 Jquery

javascript - 如何将 Google map 搜索框添加到我的自定义 map ?

javascript - 加载内部指令后访问子元素图像

javascript - 延迟除特定项目外的所有项目

javascript - Jquery鼠标事件替代

javascript - 检测嵌套列表 id

javascript - 本地推送通知到 Win8 Live Tile 在应用程序内运行 JS 代码

javascript - 每秒使用 XMLHttpRequest 与使用 Web 套接字的可行性?