【发布时间】:2015-07-22 10:14:30
【问题描述】:
根据this MDN article 和我能找到的任何其他来源,“警报”和“确认”不是 JavaScript 中的保留字。为什么它们没有在这里列出,它们在函数体中用作变量名是否安全?
【问题讨论】:
-
没有什么能阻止你覆盖内置的 javascript 函数,但这样做是一个糟糕的主意。
根据this MDN article 和我能找到的任何其他来源,“警报”和“确认”不是 JavaScript 中的保留字。为什么它们没有在这里列出,它们在函数体中用作变量名是否安全?
【问题讨论】:
是的,它们不是保留字。
在 ECMAScript 5 中,reserved words 是:
break,do,instanceof,typeof,case,else,new,var,catch,finally,return,void,continue,for,switch,while,debugger,function,this,with,default,delete,throw,throw,throw in,try。class,enum,extends,super,const,export,import。并且,在严格模式下,implements、let、private、public、yield、interface、package、protected、static。null
true,false。由于alert 和confirm 是标识符名称并且不是保留字,因此它们是标识符。因此,它们可以安全地用作变量名。
var alert = 1,
confirm = 2;
document.body.innerHTML = alert + confirm; // 3
【讨论】:
只要您使用var 声明它们,它们就可以安全地在函数体内使用。如果您不使用 var 声明它们,那么您将在全局(窗口)范围内覆盖它们,这可能会导致很多问题。
【讨论】:
(function(){ var alert = 'foobar'; })(),然后通过运行仍然返回本机警报功能的alert 检查了全局警报的值。
(function(widow,undefined) { }(window, undefined)); 这样的模式,它用于保存全局对象以供在函数内部使用。
它们不是保留字,因为它们是“全局”(“窗口”的属性)函数。 给它们赋值将导致它们在同一范围内失去功能,例如:
alert = "sdfsdf";
...
alert("something");
会导致“TypeError: alert is not a function”等错误。
【讨论】:
它们没有列出,因为它们不是保留字。
alert 和 confirm 是 window 对象上的函数,它是浏览器中的全局范围。因为它是全局的,所以您可以将其属性作为裸词引用。
//Equivalent
window.alert('test');
alert('test');
您可以在函数内部安全地使用它们。这样做会隐藏裸露的使用,但您仍然可以调用window.alert() 来访问它们。
【讨论】:
你可以重写这些函数,没有什么能阻止你。
如果您有自定义对象或函数:
var obj = { alert: 1, confirm: 2};
function func(){
var alert = 1;
var prompt = 2;
}
这不是问题。
但是,如果您在窗口对象上覆盖实际的 alert 或 confirm 函数,如果包含依赖于这些函数的库,您可能会遇到麻烦。
为了禁用烦人的alert() 框,这可能很有用。
【讨论】: