声明alert()等方法是否会覆盖Javascript中的内置alert()方法?

时间:2015-10-25 10:21:54

标签: javascript

我正在尝试定义内置方法alert()以查看控制台会抛出什么样的错误,而是内置的alert()被覆盖。

这是代码 -

function alert(some_string) {
    console.log(some_string+some_string);
}

function say() {
    alert("Hello");
}

say();

输出为: HelloHello

来自Java背景,它会抛出编译错误:

  

错误:方法alert()已定义

那么这里发生了什么?我真的覆盖了这个方法吗?

1 个答案:

答案 0 :(得分:3)

Overriding是一个经典的OO术语,这意味着子类具有与其继承的类之一具有相同名称的方法,而不是在子类上使用该方法。

在这种情况下,您可以直接获取alert变量(默认情况下具有浏览器提供的函数值)并为其指定一个新值(您刚刚声明的函数)。

(假设您正在全局范围内工作。如果您在本地范围内,您只需要屏蔽变量,这样您就只能使同一范围内的其他代码无法访问alert ...你也在编写代码,它不会成为一个问题,因为你会知道你是否需要全局alert并且可以避免重复使用它的名字。)

  

可能有数百个内置函数,我可能会意外地定义一个与其中一个函数同名的函数,如何检查这些事故是否发生?

有两种基本技巧。

避免创建全局

创建新变量时,请在尽可能窄的范围内进行。一种常见的模式是使用IIFE为与给定代码相关的所有变量创建新范围。

(function () {
    "use strict";

    function alert() {
        // Locally scoped alert that doesn't get in the way
        // of any variable called `alert` from the browser
        // or another library
    }

})();

使用命名空间

这只是将单个全局作为一堆相关代码的入口点的术语。它通常被赋予一个不太可能与其他代码冲突的ALL_CAPS名称。

这允许从任何地方访问函数,比如全局变量,而不会创建大量的全局变量。

var MYLIBRARY;

(function () {
    "use strict";

    MYLIBRARY = {
        alert: alert
    };

    function alert() { /* etc */ }

})();