像alert()这样的声明方法是否会覆盖Javascript中内置的alert()方法?
Does declaring methods like alert() override the built-in alert() method in Javascript?
我尝试定义内置方法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 */ }
})();
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- angularJS:window.alert仅在方法完成后
- Watir WebDriver:未定义的方法“alert”
- 不能在 jQuery 方法中使用 alert()
- alert() 方法不会导致 window.focus on modern browsers
- 未捕获的类型错误:对象#<HTML文档>没有方法'alert'
- 重写默认的浏览器alert()方法
- 在使用alert方法时,是否应该在javascript中指定父对象
- 斜体字在Javascript中不起作用'alert()'方法
- 像alert()这样的声明方法是否会覆盖Javascript中内置的alert()方法?
- & lt; br>在alert()方法中删除PRE标记的内容
- Alert不会在onSubmit方法中被调用
- 为什么document.write()和alert()方法呈现JavaScript对象的方式不同?
- WebDriver's executeScript返回alert文本,而不是JavaScript方法返回的值
- 有什么方法可以强制Internet Explorer打开alert()吗
- 有没有一种方法可以像alert()函数那样在JavaScript中强制同步行为
- 创建不带display-javascript的alert()方法
- 延迟作业的回调方法-render js alert
- 由 alert() 修复的 JavaScript 方法处理