使用 "alert" 和 "confirm" 作为变量名

Using "alert" and "confirm" as variable names

根据 this MDN article 和我能找到的任何其他来源,"alert" 和 "confirm" 不是 JavaScript 中的保留字。为什么它们没有在这里列出,它们在函数体内用作变量名是否安全?

是的,它们不是保留字。

在 ECMAScript 5 中,reserved words 是:

  • Keywords: break, do, instanceof, typeof, case, else, new, var, catch, finally, return, void, continue, for, switch , while, debugger, function, this, with, default, if, throw, delete, in, try.
  • Future Reserved Words: class, enum, extends, super, const, export, import.并且,在严格模式下,implementsletprivatepublicyieldinterfacepackageprotected, static.
  • Null Literals: null
  • Boolean Literals: true, false.

由于 alertconfirm 是标识符名称并且不是保留字,因此它们是标识符。因此,它们可以安全地用作变量名。

var alert = 1,
    confirm = 2;
document.body.innerHTML = alert + confirm; // 3

您可以覆盖这些功能,没有什么能阻止您。

如果您有自定义对象或函数:

var obj = { alert: 1, confirm: 2};
function func(){
    var alert = 1;
    var prompt = 2;
}

这不是问题。

但是,如果您重写 window 对象上的实际 alertconfirm 函数,并且包含依赖于该函数的库,则可能会遇到麻烦。

为了禁用烦人的 alert() 框,这可能很有用。

因为不是保留字,所以没有列出。

alertconfirmwindow 对象上的函数,它是浏览器中的全局范围。因为它是全局的,所以您可以将其属性作为裸词引用。

//Equivalent
window.alert('test');
alert('test');

您可以在函数内部安全地使用它们。这样做会隐藏 bare use,但您仍然可以调用 window.alert() 来访问它们。

它们不是保留字,因为它们是 "global"("window" 的属性)函数。 为它们赋值将导致它们在相同范围内失去功能,例如:

alert = "sdfsdf";
...
alert("something");

将导致错误,例如 "TypeError: alert is not a function"。

只要您用 var 声明它们,就可以安全地在函数体内使用它们。如果您不使用 var 声明它们,那么您将在全局 (window) 范围内覆盖它们,这可能会导致很多问题。