Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
像alert()这样的声明方法会覆盖Javascript中的内置alert()方法吗?_Javascript - Fatal编程技术网

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

像alert()这样的声明方法会覆盖Javascript中的内置alert()方法吗?,javascript,Javascript,我正在尝试定义内置方法警报,以查看控制台将抛出何种错误,但内置警报被覆盖 这是守则- function alert(some_string) { console.log(some_string+some_string); } function say() { alert("Hello"); } say(); 输出为:HelloHello 来自Java背景,它会抛出编译错误,如下所示: 错误:已定义方法警报 那么这里发生了什么?我真的重写了这个方法吗?重写是一个经典的OO术语

我正在尝试定义内置方法警报,以查看控制台将抛出何种错误,但内置警报被覆盖

这是守则-

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

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

say();
输出为:HelloHello

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

错误:已定义方法警报


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

重写是一个经典的OO术语,它意味着子类的方法与它继承的一个类的名称相同,而不是在子类上使用该方法

在本例中,您直接获取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,不太可能与其他代码冲突

这允许从任何地方访问函数,如globals,而无需创建大量全局变量

var MYLIBRARY;

(function () {
    "use strict";

    MYLIBRARY = {
        alert: alert
    };

    function alert() { /* etc */ }

})();

重写函数在JavaScript中不是什么大问题。但可以理解的是,这并不总是一个好主意……可能有数百个内置函数,我可能会意外地定义一个与其中一个同名的函数,我如何检查这些意外事件是否没有发生?关键是,在JS中,这样的定义实际上意味着重新定义全局对象窗口的属性