【问题标题】:Using "alert" and "confirm" as variable names使用“alert”和“confirm”作为变量名
【发布时间】:2015-07-22 10:14:30
【问题描述】:

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

【问题讨论】:

  • 没有什么能阻止你覆盖内置的 javascript 函数,但这样做是一个糟糕的主意。

标签: javascript reserved-words


【解决方案1】:

是的,它们不是保留字。

在 ECMAScript 5 中,reserved words 是:

  • Keywordsbreakdoinstanceoftypeofcaseelsenewvarcatchfinallyreturnvoidcontinueforswitchwhiledebuggerfunctionthiswithdefaultdeletethrowthrowthrow intry
  • Future Reserved Wordsclassenumextendssuperconstexportimport。并且,在严格模式下,implementsletprivatepublicyieldinterfacepackageprotectedstatic
  • Null Literals: null
  • Boolean Literalstruefalse

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 看来你是对的。为了测试这一点,我打开了一个 Chrome 控制台并运行了这一行:(function(){ var alert = 'foobar'; })(),然后通过运行仍然返回本机警报功能的alert 检查了全局警报的值。
    • 正如另一位评论者发布的那样,请注意,如果您想在函数内使用全局警报,可以将其引用为 window.alert
    • 您可能还见过像(function(widow,undefined) { }(window, undefined)); 这样的模式,它用于保存全局对象以供在函数内部使用。
    【解决方案3】:

    它们不是保留字,因为它们是“全局”(“窗口”的属性)函数。 给它们赋值将导致它们在同一范围内失去功能,例如:

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

    会导致“TypeError: alert is not a function”等错误。

    【讨论】:

      【解决方案4】:

      它们没有列出,因为它们不是保留字。

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

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

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

      【讨论】:

        【解决方案5】:

        你可以重写这些函数,没有什么能阻止你。

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

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

        这不是问题。

        但是,如果您在窗口对象上覆盖实际的 alertconfirm 函数,如果包含依赖于这些函数的库,您可能会遇到麻烦。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多