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

Does declaring methods like alert() override the built-in alert() method in Javascript?

本文关键字:方法 alert Javascript 覆盖 内置 声明 是否      更新时间:2023-09-26

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

代码-

function alert(some_string) {
    console.log(some_string+some_string);
}
function say() {
    alert("Hello");
}
say();
HelloHello

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

错误:方法alert()已经定义

那么这里发生了什么?我是否真的重写了这个方法?

重写是一个经典的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 */ }
})();